- 1、本文档共26页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linuxppt整理
Linux的进程和进程间通信 进程创建 创建一个进程的系统调用很简单。只要调用fork 函数: #include unistd.h pid_t fork(); 当一个进程调用了fork 以后,系统会创建一个子进程。这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,就象符进程克隆(clone)自己一样。 父进程和子进程 为了区分父进程和子进程,必须跟踪fork 的返回值。 当fork调用失败的时候fork 返回-1,否则fork 的返回值有重要的作用。 对于父进程fork 返回子进程的ID,而对于fork 子进程返回0。可以根据这个返回值来区分父子进程。 阻塞 有时希望子进程继续执行,而父进程阻塞直到子进程完成任务。可以调用wait 或者waitpid 系统调用。 #include sys/types.h #include sys/wait.h pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid,int *stat_loc,int options); wait wait 系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号。如果父进程没有子进程或者他的子进程已经结束了,wait 回立即返回。成功时(因一个子进程结束)wait 将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc 是子进程的退出状态。 子进程调用exit,_exit 或者是return 来设置这个值. 为了得到这个值Linux 定义了几个宏来测试这个返回值: WIFEXITED:判断子进程退出值是非0 WEXITSTATUS:判断子进程的退出值(当子进程退出时非0). WIFSIGNALED:子进程由于有没有获得的信号而退出. WTERMSIG:子进程没有获得的信号号(在WIFSIGNALED 为真时才有意义). waitpid waitpid 等待指定的子进程直到子进程返回。 如果pid 为正值则等待指定的进程(pid)。如果为0 则等待任何一个组ID 和调用者的组ID 相同的进程。为-1 时等同于wait 调用。小于-1 时等待任何一个组ID 等于pid 绝对值的进程。stat_loc 和wait 的意义一样。options 可以决定父进程的状态,可以取两个值: WNOHANG:父进程立即返回当没有子进程存在时. WUNTACHED:当子进程结束时waitpid 返回,但是子进程的退出状态不可得到. 调用系统程序 调用系统程序, 可以使用系统调用exec 族调用。exec 族调用有着5 个函数: #include unistd.h int execl(const char *path,const char *arg,...); int execlp(const char *file,const char *arg,...); int execle(const char *path,const char *arg,...); int execv(const char *path,char *const argv[]); int execvp(const char *file,char *const argv[]): 例子1 #include unistd.h #include sys/types.h #include sys/wait.h #include stdio.h #include errno.h #include math.h void main(void) { pid_t child; int status; printf(This will demostrate how to get child status\n); if((child=fork())==-1) { printf(Fork Error :%s\n,strerror(errno)); exit(1); 例子1(续) } else if(child==0) { int i; printf(I am the child:%ld\n,getpid()); for(i=0;i1000000;i++) i++; i=5; printf(I exit with %d\n,i); exit(i); } while(((child=wait(status))==-1)(errno==EINTR)); if(child==-1) printf(Wait Error:%s\n,strerror(errno)); else if(!status) printf(Child %ld terminated normally return statu
文档评论(0)