Chinaunix首页 | 论坛 | 博客
  • 博客访问: 686309
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1793
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 12:26
个人简介

相信自己,只有不想做的,没有做不到的。

文章分类

全部博文(152)

文章存档

2021年(1)

2015年(2)

2014年(74)

2013年(75)

分类: 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;
}


阅读(1317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~