进程间的通信方式有信号、管道和FIFO、共享内存、消息队列、文件锁、信号量。
1.信号
信号的来源有:
硬件来源,如按下"ctrl C",
软件来源,如发送信号的kill(),raise(),alarm()等系统函数发送的信号。
进程对信号的处理:
忽略信号,捕捉信号(为捕捉到的信号指定信号处理函数),执行系统默认处理方式(一般是终止进程)。
信号处理函数signal
信号的处理一般用signal函数,它用来设置进程在接收到信号时的动作。
signa的声明如下:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
如果handler不是函数指针,则signum必须是SIG_IGN(忽略信号)或SIG_DFL(则按照默认的的方式处理信号)。
否则,signum设置为具体的信号值,signal会把handler设为指定的信号值的处理函数。
#include<stdio.h>
#include<signal.h>
void handle(int sig)
{
printf("recv signal:%d\n",sig);
}
int main()
{
while(1)
{
signal(SIGINT,handle);
}
return 0;
}
当按下"cttrl C"时,程序就打印recv signal:2
发送信号的函数
信号的发送:
只有具有root权限的进程才能向其他任意进程发送信号,一般的进程只能向具有相同uid和gid的进程发送信号。
常用的信号的发送函数主要有:kill、raise、alarm、setitimer、abort等。
kill函数
kill()函数用来向指定的进程发送一个信号,kill()的函数声明如下:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
pid为接收信号