首先注意:
这里是进程间的信号通信(signal),不是信号量通信(semaphore)。
Linux系统支持的所有信号均定义在 /usr/include/asm/signal.h,其中常见的信号有:
- SIGKILL: 杀死进程
- SIGSTOP:暂停进程
- SIGCHLD:子进程停止或结束时用来通知父进程
发送信号
函数原形:
int kill(pid_t pid, int sig);
函数功能: 发送信号给进程或进程组。
所属头文件:
#include <sys/types.h>
#include <signal.h>
返回值:
若成功,返回0;若失败,返回-1.
参数说明:
pid:
大于0:pid指向接收信号的进程
等于0:信号被发送给所调用进程所在的进程组的所有进程。
等于-1:信号被发送给允许本进程发送信号的所有进程。
小于-1:信号被发送给进程组的所有-pid进程。
sig:指明要发送的信号,若等于0,则无信号发送。
处理信号
函数原形:
//下面是一个函数指针,有一个int类型的参数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函数功能: 设置信号的处理方式。
所属头文件:
#include <signal.h>
返回值:
若成功,返回前一个处理函数的指针;若失败,返回SIG_ERR。
参数说明:
signum:要处理的信号
handler:对应信号的处理方式,有如下三种取值:
SIG_IGN:忽略信号,不处理。
SIG_DFL:采用默认方式,交给内核处理。
用户自定义的函数:交给用户定义的函数来处理。
进程等待信号命令
函数原形:
int pause(void);
函数功能:
进程等待,直到信号的到来。
所属头文件:
#include <unistd.h>
返回值:
只有捕捉到信号,并且信号处理函数返回时,返回-1
例程:
1、发送信号的进程
/* AB两个进程实现信号通信,A进程的代码 */
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
/* A进程 向 B进程 发送 一个叫 SIGINT 的信号*/
void main(int argc, char *argv[])
{
pid_t pid;
pid = atoi(argv[1]); //转化为整形
kill(pid, SIGINT); //发送SIGINT信号
}
2、接收信号的进程
/* AB两个进程实现信号通信,B进程的代码 */
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
/* A进程 向 B进程 发送 一个叫 SIGINT 的信号*/
void myfunc(int a)
{
printf("Process B received the signal SIGINT.\n");
}
void main()
{
signal(SIGINT, myfunc);//要处理SIGINT这个信号,用自定义的myfunc函数来处理
pause();//
}