有两个用户进程,一个进程用来接受及处理信号,名字叫做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