信号通讯编程

编写两个应用程序,利用两个进程进行信号通信

1、信号的概念:是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序或终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就会忽略该信号,如果是SIG_DFT,则会 采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。

2、通过kill -l命令我们可以查看到Linux支持的信号列表。位于/usr/include/asm/signal.h

SIGTST 20   停止进程的运行,但该信号可以被处理和忽略,用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

通过命令kill -[-s signal |-signal] pid可以向进程号为pid的进程发送signal信号(可以是信号宏名或者对应编号)

3、传送信号给指定的进程----kill

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

原型:int kill(pid_t pid,int sig)

参数说明:sig:设置信号处理函数所依赖的信号编号,pid:接收信号的进程号,pid>0将信号传给进程标识码为pid的进程;pid=0将信号传给和目前进程相同进程组的所有进程。pid<0将信号传给进程组识别码为pid绝对值的所有进程。

返回值:执行成功则返回0,失败则返回-1.

注意可以在命令行输入以下命令到相应进程7651:kill -n SIGINT 7651

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。http://baike.baidu.com/link?url=qfLQVjdillsIymnAx3Om5pvb72o5eXmzEf_qqZ3vB5yv5Le34eZoTo_RGW08LF5MvA2KmwL2EtiKaOmXNSAdta

信号处理--signal

头文件:#include<signal.h>

函数原型:void (*signal(int signum,void(*handler)(int)))(int);

或者typedef void(*sig_t)(int);sig_t signal(int signum.sig_t handler);

参数说明:signum:设置信号处理函数所依赖的信号编号

handler:信号处理函数

如果参数handler不是函数指针,则必须是下列两个常数之一:SIG_IGN:忽略参数signum指定的信号。SIG_DFL:将参数signum指定的信号重设为预设的信号处理方式。

返回值:返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。

让进程暂停知道信号出现----pause

头文件:#include<unistd.h>

函数原型:int pause(void);

参数说明:无

返回值:只返回-1.

send_signal.c

函数atoi()是把一个字符串转换为一个整数!!!

receive_signal.c

先执行:

然后执行:

最后执行:

结果:

原文地址:https://www.cnblogs.com/gary-guo/p/5558550.html