进程间的通信之信号通信

1、  kill

        函数的作用:传递信号给指定的进程

函数的原型:int  kill(pid_t pid,  int sig)

函数的参数:pid: > 0,指定的进程pid

                pid:=0,发送给目前进程相同进程租的所有进程

                 Pid : -1,广播给系统的所有的进程

                 Sig :信号

返回值:成功:0;

              失败:-1;

头文件:#include <sys/types.h>

              #include <signal.h>


例:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <signal.h>  
  4. #include <sys/types.h>  
  5. #include <sys/wait.h>  
  6.   
  7. int main()  
  8. {  
  9.    pid_t  pid;  
  10.    int ret;  
  11.      
  12.    if((pid=fork()) < 0)  
  13.    {  
  14.       perror("fork");  
  15.       exit(1);  
  16.    }  
  17.      
  18.    if(pid == 0)  
  19.    {  
  20.         raise(SIGSTOP);  
  21.         exit(0);  
  22.    }  
  23.    else  
  24.    {  
  25.       printf("pid=%d\n", pid);  
  26.       if((waitpid(pid, NULL, WNOHANG)) == 0)  
  27.       {  
  28.              kill(pid,SIGKILL);  
  29.              printf("kill %d\n", pid);  
  30.         }  
  31.       else  
  32.       {  
  33.          perror("kill");  
  34.       }  
  35.            
  36.        }  
  37. }  

运行结果:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. pid=19218  
  2. kill 19218!  

 

2、  raise

函数的作用:发送信号给本身

函数的原型:int  raise( int  sig)

头文件:#include <singal.h>

例:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <sys/types.h>  
  2. #include <sys/stat.h>  
  3. #include <errno.h>  
  4. #include <fcntl.h>  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include <string.h>  
  8. #include <signal.h>  
  9. #include<sys/wait.h>  
  10.   
  11. int main()  
  12. {  
  13.     pid_t pid;  
  14.     int ret;  
  15.      
  16.     if((pid= fork()) < 0)  
  17.     {  
  18.         printf("Fork error.\n");  
  19.         exit(-1);  
  20.     }  
  21.     if(pid == 0)  
  22.     {  
  23.         printf("child (pid:%d) is waiting for any signal\n.", getpid());  
  24.         raise(SIGSTOP);  
  25.         exit(0);  
  26.     }  
  27.     else  
  28.     {  
  29.         if((waitpid(pid, NULL, WNOHANG)) == 0)  
  30.         {  
  31.             kill(pid, SIGKILL);  
  32.             printf("parent kill child process %d\n", pid);  
  33.                      
  34.         }  
  35.         waitpid(pid, NULL0);  
  36.         exit(0);  
  37.     }  
  38. }  

运行结果:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. child (pid:10220) is waiting for any signal  
  2. parent kill child process 10220  

 

3、  alarm

函数的作用:设置信号传送闹钟

函数的原型:unsigned int alarm(unsigned int seconds)

返回值:返回之前闹钟的剩余秒数,若之前无闹钟,返回0

例:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <unistd.h>  
  2. #include <signal.h>  
  3. #include <stdio.h>  
  4.   
  5. void handler()  
  6. {  
  7.     printf("hello\n");  
  8. }  
  9.   
  10. int main()  
  11. {  
  12.     int i;  
  13.   
  14.     signal(SIGALRM,handler);  
  15.     alarm(5);  
  16.   
  17.     for(i = 1; i < 7; i++)  
  18.     {  
  19.         printf("sleep %d ...\n",i);  
  20.         sleep(1);  
  21.     }  
  22.   
  23.     return 0;  
  24. }  

运行结果:

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. sleep 1 ...  
  2. sleep 2 ...  
  3. sleep 3 ...  
  4. sleep 4 ...  
  5. sleep 5 ...  
  6. hello  
  7. sleep 6 ...  


4、  pause

函数的作用:让进程暂停知道信号出现

函数的原型:int pause(void)

返回值:-1;

头文件:#include <unistd.h>

 

5、  singal

函数的作用:设置信号处理方式

函数的原型:void (*singal) (int signum, void (*handler)(int)))(int)

              typedef void(*sighandler_t(int)) sifhandler_t

                 singal (int signum , sighandler_t handler)


小结:

信号是进程间通信机制中唯一的异步通信机制。


信号的分类:

  *根据可靠性:可靠信号、不可靠信号

  *根据与时间的关系:实时信号、非实时信号


  进程可以通过下面三种方式来处理一个信号:

1. 忽略信号

  大多数信号都按照这种方式进行处理,但有两种信号决不能被忽略,它们是:SIGKILL\SIGSTOP

  这两种信号不能被忽略的原因是:它们向超级用户提供了一种终止或停止进程的方法

 

2. 捕捉信号

  通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理

 

3. 执行默认操作

  对大多数信号的系统默认动作是终止该进程


  发送信号的主要函数有 killraise

区别:Kill既可以向自身发送信号,也可以向其他进程发送信号。与kill函数不同的是,raise函数是向进程自身发送信号。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值