二 Linux进程间通信( 二 )

代码示例:
#include<stdio.h>#include<signal.h>#include<sys/types.h>#include<unistd.h> int main() {pid_t pid;//创建一个子进程pid = fork();{printf("child process do work.....\n");sleep(1);}exit(0);//子进程退出}else{//父进程sleep(3);printf("子进程不听话了,该退出了....\n");kill(pid,15);printf("父进程该结束了,已经完成了它的使命\n");}return 0; }运行结果如下:

二 Linux进程间通信

文章插图
(2)raise函数
#include<signal.h>int raise(int sig);功能:给当前进程发送指定信号(自己给自己发),等价于kill(getpid(),sig)参数: sig:信号编号返回值:成功:0失败:非0值代码示例:
#include<stdio.h>#include<signal.h>#include<sys/types.h>#include<unistd.h> int main() {int i = 1;while(1){printf("do working %d\n",i);//给自己发送一个信号if(i == 4){//自己给自己发送编号为15的信号raise(SIGTERM);}i ++;sleep(1);}return 0; }运行结果如下:
二 Linux进程间通信

文章插图
(3)abort函数
#include<stdlib.h>void abort(void);功能:给自己发送异常终止信号6)SIGABRT,并且产生core文件,等价于kill(getpid(),SIGABRT);参数:无返回值:无代码示例:
#include<stdio.h>#include<signal.h>#include<sys/types.h>#include<unistd.h> int main() {int i = 1;while(1){printf("do working %d\n",i);//给自己发送一个信号if(i == 4){//给自己发送一个编号为6的信号,默认的行为就是终止进程abort();}i ++;sleep(1);}return 0; }运行结果如下:
二 Linux进程间通信

文章插图
通过软件条件产生在上一篇博客介绍过,管道如果读端不读了,存储系统会发生SIGPIPE 信号给写端进程,终止进程 。这个信号就是由一种软件条件产生的,这里再介绍一种由软件条件产生的信号SIGALRM(时钟信号) 。
#include<unistd.h>unsigned int alarm(unsigned int seconds);功能:设置定时器(闹钟) 。在指定seconds后,内核会给当前进程发送14)SIGALRM信号,进程收到该信号,默认动作终止 。每个进程都有且只有唯一的一个定时器 。取消定时器alarm(0),返回旧闹钟余下秒数 。参数:seconds:指定的时间,以秒为单位返回值:返回0或剩余的秒数
  • 定时,与进程状态无关(自然定时)就绪、运行、挂起(阻塞,暂停)、终止、僵尸.......无论进程处于何种状态,alarm都计时 。
代码示例:
#include<stdio.h>#include<signal.h>#include<sys/types.h>#include<unistd.h> int main() {unsigned int ret = 0;//第一次设置闹钟5秒之后就超时 发送对应的信号ret = alarm(5);printf("上一次闹钟剩下的时间是%u\n",ret);sleep(2);//之前没有超时的闹钟被新的闹钟给覆盖ret = alarm(4);printf("上一次闹钟剩下的时间是%u\n",ret);printf("按下任意键继续...");getchar();return 0; }运行结果:
二 Linux进程间通信

文章插图
通过硬件异常产生硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号 。这里给大家介绍两个硬件异常:CPU产生异常 和 MMU产生异常
CPU产生异常 发生除零错误,CPU运行单元会产生异常,内核将这个异常解释为信号,最后OS发送SIGFPE信号给进程 。
代码示例:
#include <stdio.h>#include <unistd.h>#include <signal.h>#include <stdlib.h>int main(){// 由软件条件产生信号alarm函数和SIGPIPE// CPU运算单元产生异常,内核将这个异常处理为SIGFPE信号发送给进程int a = 10;int b = 0;printf("%d", a/b);return 0;}

经验总结扩展阅读