第7章 进程控的制程序设计.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 进程控的制程序设计

7.3.3 进程终止 例程:exit.c #include stdio.h #include stdlib.h #include unistd.h int main() { printf(“Using exit\n”); printf(“This is the content in buffer”); exit(0); //_exit(0); } //对比程序运行结果,printf(“This is the content in buffer”);后加\n结果 7.3.4 进程等待 wait()函数是用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。 waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作业控制。实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。 7.3.4 进程等待 调用wait或waitpid的进程可能会: 如果其所有子进程都还在运行,则父进程阻塞 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回 如果它没有任何子进程,则立即出错返回 7.3.4 进程等待 pid_t wait(int *status); pid_t waitpid(pid_t pid,int *status,int options); status:用于保存子进程的结束状态。 pid:为欲等待的子进程ID,其数值意义如下: pid-1:等待进程组ID为 pid 绝对值的任何子进程 pid=-1:等待任何子进程,相当于 wait() pid=0:等待进程组ID与目前进程相同的任何子进程 pid0:等待任何子进程ID为 pid 的子进程 7.3.4 进程等待 options:该参数提供了一些额外的选项来控制waitpid,可有以下几个取值或它们的按位或组合: 0:不是用任何选项; WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。 WUNTRACED:若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。 返回值: -1:调用失败。 其他:调用成功,返回值为退出的子进程ID。 7.3.4 进程等待 例程wait.c #include sys/types.h #include sys/wait.h #include unistd.h #include stdlib.h int main() { pid_t pc,pr; pc=fork(); if(pc==0){ printf(“this is child process with pid of %d\n”,getpid()); sleep(10);} else if(pc0){ pr=wait(NULL); printf(“I catched a child process with pid of %d\n”,pr); } exit(0); } 7.3.4 进程等待 例程:waitpid.c exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。 使用exec函数族主要有两种情况 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生; 如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。 7.3.5 exec函数族 7.3.5 exec函数族 exec系列函数共有6种不同的形式,统称为exec函数族。我们把这6个函数划分为两组: execl、execle 和 execlp execv、execve 和 execvp 这两组函数的不同在于exec后的第一个字符,第一组是l,在此称为execl系列;第二组是v,在此称为execv系列。这里的l是list(列表)的意思,表示execl系列函数需要将每个命令行参数作为函数的参数进行传递。而v是vector(矢量)的意思,表示execv系列函数将所有函数包装到一

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档