linux之wait函数

来源:互联网 发布:淘宝秒杀不能付款 编辑:程序博客网 时间:2024/05/16 05:35


#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int *status);

进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像下面这样:

pid = wait(NULL);

如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

wait调用例程:

/* wait1.c */

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

main()

{

        pid_t pc,pr;

        pc=fork();

 

        if(pc<0) /* 如果出错 */

               printf("error ocurred!/n");

       else if(pc==0){ /* 如果是子进程 */

               printf("This is child process with pid of %d/n",getpid());

              sleep(10); /* 睡眠10秒钟 */

            }

        else{ /* 如果是父进程 */

               pr=wait(NULL); /* 在这里等待 */

              printf("I catched a child process with pid of %d/n"),pr);

        }

       exit(0);

}

编译并运行:

$ gcc wait1.c -o wait1

$ ./wait1

This is child process with pid of 1508

I catched a child process with pid of 1508

可以明显注意到,在第2行结果打印出来前有10 秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数值,看看会出现怎样的结果。

进程同步:

   有时候,父进程要求子进程的运算结果进行下一步的运算,或者子进程的功能是为父进程提供了下一步执行的先决条件(如:子进程建立文件,而父进程写入数据),此时父进程就必须在某一个位置停下来,等待子进程运行结束,而如果父进程不等待而直接执行下去的话,可以想见,会出现极大的混乱。这种情况称为进程之间的同步,更准确地说,这是进程同步的一种特例。进程同步就是要协调好2个以上的进程,使之以安排好地次序依次执行。解决进程同步问题有更通用的方法,我们将在以后介绍,但对于我们假设的这种情况,则完全可以用wait系统调用简单的予以解决。请看下面这段程序:

#include <sys/types.h>

#include <sys/wait.h>

main()

{

        pid_t pc, pr;

        int status;

 

        pc=fork();

 

       if(pc<0)

               printf("Error occured on forking./n");

        else if(pc==0){

                /* 子进程的工作 */

                exit(0);

        }else{

               /* 父进程的工作 */

               pr=wait(&status);

              /* 利用子进程的结果 */

        }

}

这段程序只是个例子,不能真正拿来执行,但它却说明了一些问题,首先,当fork调用成功后,父子进程各做各的事情,但当父进程的工作告一段落,需要用到子进程的结果时,它就停下来调用wait,一直等到子进程运行结束,然后利用子进程的结果继续执行,这样就圆满地解决了我们提出的进程同步问题。


0 0
原创粉丝点击