进程间通信—信号(一)

信号机制是linux系统中最为古老的进程之间的通信机制。

What:信号是一种Event时间,原理都是中断机制,是一种异步处理,是一种通知。

How to do:

1、分析信号的发送方和接收方是谁

2、在接受方做好信号的安装注册。(主要是回调函数)

3、发送方触发信号的event事件发生了,驱动了在接收方应急准备好的回调函数。

最常用的发送信号的系统函数是kill(),rise(),alarm()和setitimer()等函数。

linux下可以使用“ kill -l”命令列出所有的信号:


我们来看一个用kill()函数发送信号的例子,在这个例子中,我们还定义了一个pid_printf()函数,在每行输出语句前都自动

插入当前进程ID,这样可以方便的从输出结果中看到每一句是被哪个进程输出的。

#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void pid_printf(char *format,...)
{
	va_list ap;
	va_start(ap,format);
	printf("[%d]",getpid());
	vprintf(format,ap);
	va_end(ap);
}

void signal_handler(int signo)
{
	int ret;
	pid_t pid_c;
	switch(signo)
	{
		case SIGCHLD:
			pid_c=wait(&ret);
			pid_printf("Child process PID [%d] return [%d].\n",pid_c,ret);
			break;
		case SIGUSR2:
			pid_printf("Signal SIGUSR2 received\n");
			break;
		default:
			pid_printf("Signal [%d] received\n",signo);
			break;
	}
}

int main(int argc,char **argv)
{
	pid_t pid;
	signal(SIGCHLD,signal_handler);
	signal(SIGUSR2,signal_handler);
	pid=fork();
	if(pid == 0)
	{
		pid_printf("Child process send signal SIGUSR2 to parent process.\n");
		kill(getppid(),SIGUSR2);
		pid_printf("Child process will exit with status 0.\n");
		exit(0);
	}
	else if(pid != -1)
	{
		while(1)
		{
			sleep(1);
		}
	}
	else
	{
		pid_printf("There was an error with forking!\n");
	}
	return 0;
}
运行这个程序输出如下结果:


请注意一个细节,当子进程法术SIGUSR2信号的时候,父进程并不是立即捕捉到信号,因为父进程还需要等待调度。当进程被调度的时候,

信号的处理也不一定是按照信号发送的顺序被处理的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值