信号相关函数
目录
- kill
- 函数原型
- 描述
- 返回值
- raise
- 函数原型
- 描述
- 返回值
- signal
- 函数原型
- 参数
- 信号句柄
- 返回值
- 用法
- pause
- 函数原型
- 函数返回值
- psignal
- 函数原型
- 描述
- 参数
kill
函数原型
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
描述
pid | 描述 |
---|---|
>0 | kill发送信号sig给进程pid |
0 | kill发送信号给和当前进程在同一进程组的所有进程 |
-1 | 信号发送给系统内的所有进程 |
<-1 | kill发送信号sig给进程组-pid中的每个进程 |
返回值
- 如果成功完成返回值0
- 失败返回-1,并设置errno
raise
函数原型
#include <signal.h>
int raise(int sig);
描述
发送一个sig信号给当前进程。raise()是线程安全的函数。与kill()的不同之处是,kill()发射信号给指定的进程(通过pid参数)
当raise()发射的信号,导致了一个信号句柄被调用的时候,raise()在信号句柄返回之后被返回。
返回值
成功0,失败返回非0值(不一定是-1)
signal
对一个信号指定新动作或回到其原先的动作
函数原型
#include <signal.h>
typedef void (*sighandler_t(int);
sighandler_t signal(int signum, sighandler_t handler);
参数
signum即信号值。后面的handler就是处理这个信号的动作。它的值为:
- SIG_DFL:默认动作
- SIG_IGN:忽略该信号(SIGKILL和SIGSTOP无法忽略,因为要保证root的绝对控制权)
- 信号句柄
信号句柄
信号句柄即捕获函数(这里是函数指针类型),该函数必须是只有一个整型参数,且返回值为void。
信号发送时,如果建立了信号句柄,系统在把控制转移到信号句柄之前有两种做法:
- 将阻塞后继新的信号直至信号句柄完成为止
- 首先改变该信号的动作为SIG_DEL(相当于调用signal(signum,SIG_DEL),在执行完一次信号句柄之后,将其恢复为默认动作)
BSD系统使用前者,系统V使用后一种。Linux默认采用BSD的做法,但当设置了特征测试宏_XOPEN_SOURCE
时,则采用系统V的做法,此时编译时要这样编译
gcc test.c -D_XOPEN_SOURCE
返回值
返回值是指向信号signum前一次有效动作的指针。它和函数第二个参数类型相同。返回值是:
- SIG_DFL
- SIG_IGN
- 信号句柄指针
可以保存这个值,并且在以后用它作为函数第二个参数再次调用signal(),从而恢复信号原来的动作
如果出错,返回SIG_ERR并设置errno。唯一地错误码(errno)是EINVAL
用法
void (*orig_handler)(int);
orig_handler = signal(SIGUSR1, handler);
if(orig_handler==SIG_ERR){perror("signal");exit(1);
}
if((orig_handler=signal(SIGUSR1,handler))==SIG_ERR){perror("signal");exit(1);
}
// SIGINT 信号发生之后
signal(SIGINT, orig_handler);
void (*origin_handler)(int);
void handler(int signum){printf("%s\n",strsignal(signum));
}
int main(){if((origin_handler=signal(SIGALRM,handler))==SIG_ERR){perror("signal");exit(1);} signal(SIGALRM,origin_handler);return 0;
}
pause
在进程没有结束时,进程在任何时间点都可以接受到信号
需要阻塞等待信号时,则可以调用 pause() 函数
函数原型
#include <unistd.h>
int pause(void);
函数返回值
成功:返回 0
失败:返回 -1,并设置 errno
psignal
函数原型
#include <signal.h>
void psignal(int sig, const char *msg);c
描述
打印sig对应信号的描述信息到标准错误流。
参数
sig为信号对应的数。
msg如果不为NULL,那么将msg作为输出消息的前缀。在msg和消息描述之间默认会有一个冒号和一个空格。