SIGHLD信号及其应用

来源:互联网 发布:网络直播相关法律出台 编辑:程序博客网 时间:2024/06/01 10:40

       SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态, 则应捕捉此信号

       如何应用SIGCHLD信号 异步处理僵死进程?

  1 #include<stdio.h>
  2 #include<signal.h>
  3 #include<string.h>
  4 #include<stdlib.h>
  5 #include<assert.h>
  6 //避免僵尸进程
  7 void fun(int);
  8 int main()
  9 {
 10     pid_t pid=fork();
 11      assert(pid!=-1);
 12     if(pid==0)
 13     {
 14         printf("child\n");
 15         kill(getppid(),SIGINT);     //kill函数是向进程发送某种信号   int kill(pid_t pid,int sig)
 16     }
 17     else
 18     {
 19         signal(SIGCHLD,fun);
 20         printf("father begin\n");
 21         //信号处理时唤醒了sleep,
 22         sleep(1000);    //sleep是为了产生等待子进程结束产生僵死进程
 23         printf("father over\n");

 24     }
 25 }
 26 void fun(int signal)
 27 {
 28     pid_t pid= wait(NULL);     //wait函数分析是否当前进程的某个子进程已经退出,若有wait就收集这个子进程的信息,并把它销毁后返回,wait返回值是待处理子进程的pid
 29 }

  kill函数: 用于向任何进程组或进程发送信号。

     int kill (pid_t pid,int sig)

     参数:

  pid:可能选择有以下四种:

  1、pid>0时,向pid指定的进程发送信号。

  2、pid==0,信号将送往所有与调用kill()进程的那个进程属同一个使用组的进程(发送给同一进程组的所有进程)

  3、pid=-1,信号将送往所有调用进程有权给其发送信号的进程,除了进程init。

  4、pid<-1,信号将送往以-pid为组标识的进程。

     int raise(int  signum):向调用这个函数的进程发送一个signum指定的信号

     SIGKILL信号不允许修改响应方式。

进程替换:用新的可执行文件替换进程的主体(代码、数据、资源)

进程替换方法:execl(char*pathname,char*argv1,char*argv2,....,(char*)0);

                         execx(char*pathname,char*argv[]);

写时拷贝:fork产生子进程之后,并不会完全将父进程(代码,栈区,堆区,全局变量区)拷贝一份,但是内核会将这些区域设置为只读,当父子进程中任意一个进程试图修改数据时,才会将数据所在“页”拷贝一份。