Linux C 进程间的信号通信

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 }

执行:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值