基本进程通信--信号
作者 佚名技术
来源 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于基本进程通信--信号的所有评论