linux 父进程中不阻塞不轮询回收子进程的两种方

来源:互联网 发布:电子数据取证软件 编辑:程序博客网 时间:2024/05/29 10:54

        在linux 中,子进程的正常退出后,还有一些资源没有被释放掉,一般的方式是父进程负责来回收子进程的资源,采用wait()和waitpid()函数,前者只能只能阻塞的方式等待子进程从其它状态变为僵尸态,后者可以以阻塞的方式或者轮询的方式来等待子进程的状态改变,不管是阻塞方式还是轮询方式,父进程必然要消耗一些时间开销来做这件事情,其实可以通过信号的用不阻塞不轮询的方式回收成为僵尸态的子进程,对于SIGCHLD信号,只要子进程的状态发生改变,它就会发送此信号给父进程,但是系统默认的方式是SIG_IGN,我们可以通过注册函数来捕捉这个信号,处理函数调用waitpid 以非阻塞方式来处理该信号:

    typedef struct  void *sighandler_t  (int)

    sighandler_t signal(int signum, sighandler_t handler);   //信号处理函数的定义


      在父进程中注册信号处理函数: signal(SIGCHLD, sig_handler);

    

      实现信号处理函数:  void * sig_handler(int signum)

                                            {

                                                 //信号来了调用

                                                 waitpid(-1,NULL, WNOHANG);

                                             } 


      还有一种方式,父进程显式的调用signal(SIGCHLD, SIG_IGN),将SIGCHLD 信号的处理动作设置为SIG_IGN,这样fock出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。另外需要注意的是这仅仅是个特例,对于其它情况,系统默认的动作和我们自己显示设置的动作是没有区别的,这种方式也仅仅适用于linux系统。

0 0
原创粉丝点击