Linux内核设计的艺术-进程间通信-信号

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

       另一个进程用来发送信号,名字叫做sending。它所对应的源代码如下:

#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内核设计的艺术-进程间通信-信号,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。