快速业务通道

基本进程通信--信号

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-18
57 exit because of receiving signal 14. //14对应信号SIGALRM 拥有帝国一切,皆有可能。欢迎访问phome.net
Process 5758 exit because of receiving signal 14.
Process 5759 exit because of receiving signal 14.
Process 5760 exit because of receiving signal 14.
Process 5761 exit because of receiving signal 14.
gaolu@gaolu-desktop:~$ 2、信号的处理 进程捕捉到信号以后可以有三种处理方式: ---不做任何处理(采用系统默认的处理方式); ---忽略信号(需要修改默认处理到ignore); ---捕获信号(需要修改默认处理到自定义的处理方式); ******************************************* SIGKILL和SIGSTOP是不能够被捕获的. ******************************************* 下面signal函数和sigaction函数是Linux提供的2个系统调用. (1)signal函数 调用形式sighandler_t signal(int signum,sighandler_t handler); typedef void (*sighandler_t)(int); signum:要捕获的信号值; handler:指向要调用的函数指针(可以为SIG_IGN忽略信号或者为SIG_DFL采用默认方式); 【程序实例】 代码中修改了对SIGINT的处理方式,默认为直接终止,修改成为忽略信号;对于SIGUSR1,调用函数sigusr1 进行处理后结束. #include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h> void sigusr1 (int sig)
{
printf("Get the SIGUSER signal,now process...n");
exit(0);
} int main (void)
{
if(signal(SIGINT,SIG_IGN)==SIG_ERR)
{
printf("Fail to reset signal handler of SIGINT.n");
return 1;
}
if(signal(SIGUSR1,sigusr1)==SIG_ERR)
{
printf("Fail to reset signal handler of SIGUSR1.n");
return 1;
}
pause(); 拥有帝国一切,皆有可能。欢迎访问phome.net
return 0;
} 执行结果: gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o sig systemcall2.c
gaolu@gaolu-desktop:~$ ./sig &
[1] 6011
gaolu@gaolu-desktop:~$ kill -SIGINT 6011
gaolu@gaolu-desktop:~$ jobs
[1] Running ./sig & //SIGINT被忽略了
gaolu@gaolu-desktop:~$ kill -SIGUSR1 6011
Get the SIGUSER signal,now process...
[1] Done ./sig
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ jobs
gaolu@gaolu-desktop:~$ (2)sigaction函数 该函数用于检查或者指定信号的处理动作. 调用形式int sigaction(int signum,const struct sigaction *act,const struct sigaction *oldact); ---signum:要捕捉的信号值(不包括SIGKILL和SIGSTOP); ---act:如果act非空,则按照act指向的结构体信息重新设置信号处理函数; ---oldact:如果oldact非空,将原有的信号处理函数保存在oldact指向的结构体. sigaction结构体定义和参数取值略... 【程序实例】 下面的程序打印信号1-11的处理方式,只有信号10(SIGUSR1)的默认处理方式被函数sigaction修改过,其他的打印都为默认处理SIG_DFL. #include <stdio.h>
#include <signal.h> void signal_process_info(struct sigaction *act)
{
switch(act->sa_flags)
{
case (int)SIG_DFL:
{
printf("using default handler.n");
break;
}
case (int)SIG_IGN:
{
printf("ignore the signal.n");
break;
}
default:
{
printf("use handler: %0x.n",act->sa_flags);
break;
}
}
return;
} void usr1_handler(void)
{ 拥有帝国一切,皆有可能。欢迎访问phome.net

} int main(void)
{
int i;
struct sigaction

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号