Linux C 进程间的信号通信

来源:互联网 发布:古鹰 知乎 编辑:程序博客网 时间:2024/06/08 20:32

1、信号通信

           内核中存在64种信号,即linux 内核可以发送64种信号,命令“kill -l”可以查看

            A - 信号的发送:kill、raise、alarm

                          kill(pid_t pid, int sig)

                           raise(int sig)   等价于 kill(getpid(), int sig) 即发给自己

                                                       附:终止进程  kill 9 进程号   或 raise(9) 终止自己   (9为SIGKILL信号)

                            alarm(int  n)  定时 n 秒

              B - 信号的接收:pause、sleep、while

              C - 信号的处理:signal

                             处理哪个信号

                             以什么方式处理(SIG_IGN忽略,SIG_DFL默认,myfun自定义)


2、getpid() 获得进程 id 号

      getppid()获得父进程 id 号


3、exit(0)           等价于 kill(getppid(), 17)  即,向父进程发送 17 信号(SIGCHLD)


4、wait(NULL)     可回收僵尸进程。本身为阻塞函数


代码:

  1 #include <stdio.h>      //standard input output  2 #include <sys/types.h>  //pid_t pid; fork()  3 #include <signal.h>     //signal  4 #include <stdlib.h>     //exit(0) 否则会有warning警告  5   6 void myfun(int sig)  7 {  8         int i;  9         for(i = 0; i < 5; i++) 10         { 11                 printf("sig = %d, i = %d\n",sig,i); 12                 sleep(1); 13         } 14         return; 15 } 16  17 void myfun1(int sig) 18 { 19         printf("NOTE: exit() sig = %d\n",sig); 20         wait(NULL); 21         printf("NOTE: child process has been retrieved.\n"); 22         return; 23 } 24  25 int main() 26 { 27         pid_t pid; 28         pid = fork(); 29         if(pid > 0) 30         { 31                 printf("parent pid = %d\n",getpid()); 32                 int i = 0; 33                 signal(10, myfun); 34                 //wait(NULL);   回收子进程的僵尸进程。但wait是阻塞函数。等待子进程结束时,后面的代码将无法执行 35                 signal(17,myfun1); 36                 while(1) 37                 { 38                         printf("parent process i = %d\n",i); 39                         sleep(1); 40                         i++; 41                 } 42         } 43         if(pid == 0) 44         { 45                 printf("child pid = %d, parent pid = %d\n", getpid(), getppid()); 46                 sleep(3); 47                 kill(getppid(),10);     //getppid()获取父进程id。10为SIGUSR1信号 48                 sleep(3); 49                 exit(0);        //等价于 kill(getppid(),17)。17 为 SIGCHLD信号 50         } 51         return 0; 52 }

执行:


原创粉丝点击