您的位置:首页 > 其它

进程间通信—信号(一)

2013-08-22 21:04 106 查看
信号机制是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信号的时候,父进程并不是立即捕捉到信号,因为父进程还需要等待调度。当进程被调度的时候,

信号的处理也不一定是按照信号发送的顺序被处理的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: