有两个用户进程,一个进程用来接受及处理信号,名字叫做processing。它所对应的程序源代码如下:
#include <stdio.h>
#include <signal.h>
void sig_usr(int signo)
{
if(signo == SIGUSR1)
printf("received SIGUSR1\n");
else
printf("received %d\n",signo);
signal(SIGUSR1,sig_usr);
}
int main(int argc ,char **argv)
{
signal(SIGUSR1,sig_usr);
for(;;)
pause();
return 0;
}#include <stdio.h>
int main(int argc, char **argv)
{
int pid,ret,signo;
int i;
if(argc != 3)
{
printf("Usage:sensig<signo> <pid>\n");
return -1;
}
signo = atoi(argv[1]);
pid = atoi(argv[2]);
ret = kill(pid,signo);
for(i=0;i<1000000;i++)
if(ret !=0)
printf("send signal error\n");
}
系统支持两种方式给进程发送信号:一种方式是一个进程通过调用特定的库函数给另一个进程发送信号;另一种方式是用户通过键盘输入信息产生键盘中断后,中断服务程序给进程发送信号。这两种方式的信号发送原理是相同的,都是通过设置信号位图上的信号位来实现。
系统通过两种方式来检测进程是否接受到信号:一种方式是在系统调用返回之前检测当前进程是否接收到信号;另一种方式是时钟中断产生后,其中断服务程序执行结束之前,检测当前进程是否接收到信号。
当用户进程需要处理信号时,进程的程序将暂时停止执行,转而去执行信号处理函数,待信号处理函数执行完毕后,进程程序将从“暂停的现场处”继续执行。
目前处于shell环境中:
第一步:输入如下指令:运行processing进程的程序
[/usr/root]# ./processing &
<160>
[/usr/root]# 第二步:输入如下指令,运行sendsig进程的程序,发送信号SIGUSR1给processing进程。
[/usr/root]# ./sendsig 10 160
received SIGUSR1
[/usr/root]# 未完,待续。
Linux内核设计的艺术-进程间通信-信号,布布扣,bubuko.com
原文:http://blog.csdn.net/jltxgcy/article/details/22038017