首页 > 系统服务 > 详细

Linux信号函数

时间:2016-03-28 14:52:06      阅读:266      评论:0      收藏:0      [点我收藏+]

1. signal函数:

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

ret-成功返回信号以前的处理配置 出错返回SIG_ERR

比较容易理解的形式:

typedef void Sigfunc(int);

Sigfunc *signal(int, Sigfunc *);

三个宏定义:

#define SIG_ERR (void(*)())-1 //这里应该是早期写法 函数声明 不检查参数类型 #define SIG_ERR(void(*) (int))-1
#define SIG_DFL (void(*)())0
#define SIG_IGN (void(*)())1

SIG_ERR: 信号注册失败返回SIG_ERR

SIG_DFL: 采用系统对此信号的默认动作;

SIG_IGN: 忽略此信号,注意SIGKILL和SIGSTOP不能忽略;

这三个宏定义不是一定要使用上面的三个值,但是必须是不能声明函数的地址;

 

2. 测试代码:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <signal.h>
 4 
 5 static void sig_user(int signo)
 6 {
 7     if (signo == SIGUSR1){
 8         printf("reveived SIGUSR1\n");
 9     }
10     else if (signo == SIGUSR2){
11         printf("reveived SIGUSR2\n");
12     }
13 }
14 
15 int main()
16 {
17     if (signal(SIGUSR1, sig_user) == SIG_ERR){
18         perror("can‘t catch SIGUSR1\n");
19     }
20 
21     if (signal(SIGUSR2, sig_user) == SIG_ERR){
22         perror("can‘t catch SIGUSR2\n");
23     }
24 
25     for ( ; ; ){
26         pause();
27     }
28 
29     return 0;
30 }

 

3. 进程启动和创建都信号影响;

程序启动:当执行一个程序时,所有信号的状态都是系统默认或者忽略。通常所有的信号都被设置成他们的默认动作,除非调用exec的进程忽略该信号。确切的讲,exec函数将原先设置为要捕捉的信号都更改为它们的默认动作,其他信号的状态则不变;(对于一个进程原先要捕捉的信号,当其执行了一个新程序后,自然不能再捕捉它了,因为信号捕捉函数的地址很可能在所执行的新程序文件中已无意义)

进程创建:当一个进程调用fork时,其子进程继承父进程的信号处理方式。因为子进程在开始时恢复了父进程的存储映像,所以信号捕捉函数的地址在子进程中是有意义的; 

 

Linux信号函数

原文:http://www.cnblogs.com/wanpengcoder/p/5328425.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!