- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.信号
1.1 信号处理
1)忽略:不予理睬;
2)默认:系统预定义的处理方式(缺省处理);
3)捕获:通过编程来针对特定信号,做出特殊处理;
SIGKILL(9),不能被忽略或捕获,而只能采用默认方式处理:令进程终止;
SIGTERM(15),可以忽略或捕获,改变其默认行为,而其默认方式:令进程终止;
****尝试SIGINT/SIGQUIT信号的默认处理**************************************
#includestdio.h
#includestdlib.h
#includeunistd.h
int main()
{
printf(我在运行Ctrl+C或Ctrl+\\终止...\n);
for(;;);
return 0;
}
1.2 捕获信号
signal()函数
使用时引入头文件signal.h
功能:设置针对特定信号的处理方式。
格式:#include signal.h
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
注意:第一个参数:信号值;
第二个参数:信号处理函数的指针,sighandler_t是一个函数指针类型;有两个特殊值:SIG_IGN(忽略)/SIG_DFL(默认)
每次系统内核产生信号,都会使进程转而执行signal函数注册的信号处理函数
返回值:成功以前的信号处理函数的指针,有两个特殊值:SIG_IGN(忽略)/SIG_DFL(默认),失败返回SIG_ERR。
信号处理函数的形式:void sighandler(int signum/*信号编号*/){信号处理代码};
tips:某些Unix系统,通过signal函数注册的信号处理函数只能一次性有效。系统内核在调用信号处理函数之前会先将对该信号的处理恢复默认。对于这种情况,可以在信号处理函数返回之前通过signal函数再次注册即可。
多个不同个信号可以通过一个信号处理函数处理。在信号处理函数内部,根据其信号编号参数区分不同的处理方式。
****使用signal函数更改信号处理*************************************************
#includestdio.h
#includesignal.h
#includeunistd.h
//定义自己的处理函数
void sigint(int signum)
{
printf(%d进程:我收到了%d信号\n,getpid(),signum);
//再次注册,以确保所注册的信号处理函数持续有效
signal(SIGINT,sigint);
}
int main()
{
//更改原来的ctrl+c处理方式为忽视:SIG_IGN
if(SIG_ERR==signal(SIGINT,SIG_IGN))
{
perror(signal);
return -1;
}
printf(%d进程:我在运行Ctrl+C测试,Ctrl+\\终止...\n,getpid());
//使用自己的函数处理
//按下ctrl+l引起用户态的中断,切换至内核态
//内核态开始调用信号处理函数,即进行中断处理,处理结束根据断点现场数据返回内核态,最终由内核态返回用户态
if(SIG_ERR==signal(SIGINT,sigint))
{
perror(signal);
return -1;
}
for(;;);
return 0;
}
一个进程无论什么原因终止运行,都会向其父进程递送SIGCHLD(17)信号。因此父进程可以在对该信号的处理函数中回收子进程的僵尸。需要注意的是,SIGCHLD信号并不可靠,因此在其信号处理函数执行过程中信号有可能被丢弃,进而导致漏网僵尸。为此,可以采用在循环中通过waitpid以非阻塞方式回收尽可能多的僵尸的方法加以解决。
****使用信号处理函数处理多个子进程回收的异步处理******************************
#includestdio.h
#includestdlib.h
#includeunistd.h
#includestring.h
#includesys/wait.h
#includesignal.h
#includeerrno.h
void sigchld(int signum)
{
for(;;)
{
文档评论(0)