使用信号时离不开各种函数,本文来看看在使用信号时最常用的几个函数。
- kill:给指定进程发送指定信号
- raise:给调用进程发送指定信号
- abort:终止程序的运行
- alarm:定时器
- sigqueue:给指定进程发送指定信号并携带信息
- signal:修改指定信号的处理方式
1.kill
int kill(pid_t pid, int sig)
作用:给指定的进程发送一个指定的信号。
- pid_t pid:指定的进程id
- int sig:要发送的信号。注意:信号其实是一个宏。
返回值:成功返回0,失败返回-1。
2.raise
int raise(int sig)
作用:给调用这个函数的进程发送一个指定的信号。
- int sig:发送的信号
返回值:成功返回0,失败返回非0。
3.abort
void abort()
作用:中止程序执行,直接从调用的地方跳出。这其实是一个异常。SIGABRT
4.alarm
unsigned int alarm(unsigned int seconds)
作用:这个是定时器,当程序调用这个函数之后,开始计时,当计时到达规定时间后,内核会发送SIGALRM信号(信号作用:退出进程)给进程。
- unsigned int seconds:要计时的时间长度
5.sigqueue
int sigqueue(pid_t pid, int sig, const union sigval value)
作用:给指定进程发指定信号并携带信息。
- pid_t pid:指定的进程id
- int sig:要发送的信号
- const union sigval value:要携带的信息,通常并不会携带信息,因此通常置NULL
返回值:成功返回0,失败返回非0。
6.signal
typedef void (*sighandler_t)(int)
这是声明了一个返回值为void,参数为int的函数指针类型。
sighandler_t signal(int signum, sighandler_t handler)
作用:修改指定信号的处理方式
- int signum:传入指定信号
- sighandler_t handler:该信号新的处理方式。可以传入自定义的信号处理函数 或者 SIG_DFL(默认处理方式)或者 SIG_IGN(忽略处理方式)
返回值:该信号原先的信号处理函数
7.例子
这里来展示一下如何修改指定信号的处理函数。
(1)定义自定义处理函数:
- void sigcb(int no){}
注意自定义处理函数的形式,函数的形式必须和系统的默认处理函数相同,返回值为void,参数为int。
这个 int no 参数其实就是这个处理函数对应的信号,调用这个处理函数时,就会把信号作为参数传递进去。
(2)修改3号信号的处理函数为sigcb函数:
- signal(3,sigcb)
signal函数的返回值是3号信号原先的处理函数。