相信自己,只有不想做的,没有做不到的。
分类: LINUX
2013-12-16 21:52:41
四 信号
信号:一种异步进程间通信方式
一些特殊信号:
ctrl + c 发送SIGINT
不能忽略信号:SIGKILL,SIGSTOP
默认被忽略的信号SIGCHLD
大部分都是杀死进程
用户自定义的信号:SIGUSR1,SIGUSR2 通常用于程序中
进程对信号的响应方式:
1.忽略
2.捕捉(当信号到达的时候执行信号处理函数)
3.默认处理
设置进程对信号的处理方式:
/*不需要自
...己声明,头文件中有说明*/
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
handler:
SIG_IGN 忽略信号
SIG_DFL 默认处理
信号处理函数的入口地址
例如:忽略SIGINT信号
if(signal(SIGINT,SIG_IGN) == SIG_ERR)
{
perror("Fail to signal");
....
}
捕捉SIGUSR1信号
if(signal(SIGUSR1,handler_signal) == SIG_ERR)
{
perror("Fail to signal");
....
}
练习:
不轮询,不阻塞,回收僵尸态进程
1.设置SIGCHLD信号的处理方式为捕捉
2.信号处理函数
void handler_signal(int signum)
{
waitpid(-1,NULL,NOHANG);
}
Linux最简单的方法,设置对SIGCHLD处理方式为忽略
(告诉僵尸态子进程出现,让内核直接处理)
if(signal(SIGUSR1,SIG_IGN) == SIG_ERR)
{
...
}
//实现代码如下
#include
#include
#include
#include
#include
void handler_signal(int signum)
{
printf("Child over.\n");
waitpid(-1,NULL,WNOHANG);
}
int main(int argc, const char *argv[])
{
pid_t pid;
#if 0
if(signal(SIGCHLD,handler_signal) == SIG_ERR)
{
perror("Fail to signal");
exit(EXIT_FAILURE);
}
#endif
if(signal(SIGCHLD,SIG_IGN) == SIG_ERR)
{
perror("Fail to signal");
exit(EXIT_FAILURE);
}
if((pid = fork()) < 0)
{
perror("Fail to fork");
exit(EXIT_FAILURE);
}
if(pid == 0)
{
while(1);
}
if(pid > 0)
{
while(1)
{
printf("Running.\n");
sleep(1);
}
}
return 0;
}