信号的发送函数
前面介绍了Linux中信号的一些基本情况,这里总结一下信号的发送。
信号的发送主要由函数kill()、raise()、sigqueue()、alarm()、settimer()、abort()
来完成。
kill()函数
kill()
函数用来发送信号给指定进程,在shell下输入man 2 kill
可以获得其相关的函数原型:
#include <sys/types.h>
#include <signal.h>
int kill( pid_t pid, int sig );
- 第一个参数是相应进程的ID
- 第二个参数表示信号的编号
- 函数执行成功返回0;发生错误返回-1,错误代码存入errno中
- 只有具有root权限的进程才能向其他任一进程发送信号,非root权限的进程只能向属于同一个组或用户的进程发送信号
关于第一个参数,有如下注意:
- pid为进程ID:发送信号给对应ID的进程
- pid为0:发送信号给当前进程所属进程组中所有的进程
- pid为-1:发送信号给系统内除过1号进程(init进程)和自身进程以外的所有进程
- pid比-1小:发送信号给进程组(-pid)的所有进程
raise()函数
raise()函数是ANSI C而非POSIX标准定义的,可以用来给调用raise()
函数的进程发送信号,在shell下输入man raise
可获取其函数原型:
#include <signal>
int raise( int sig );
- 参数sig代表要发送信号的编号
- 发送成功返回0,失败返回-1
sigqueue()函数
sigqueue()函数是一个比较新的发送信号函数,它与kill()
函数发送信号时的创新在于,sigqueue()
在发送信号的同时还支持携带参数,但sigqueue()
不能给一组进程发送信号,在shell中输入man sigqueue
可获取函数原型:
#include <signal.h>
int sigqueue( pid_t pid, int sig, const union sigval value );
- 参数value是一个共用体,其定义如下:
union sigval
{
int sigval_int;
void *sigval_ptr;
};
- value可以携带的数据可以是整型或者是一个void型指针
- 函数执行成功返回0,有错误时返回-1,错误代码存入errno中
alarm()函数
alarm()函数可以用来设置定时器,当定时器超时时,会发送SIGALRM信号给调用alarm()
函数的进程,在shell下输入man alarm
可获取函数原型:
#include <unistd.h>
unsigned int alarm( unsigned int seconds );
- 调用
alarm()
函数只会发送一次信号 - 参数seconds用来设置秒数,到达计时时间后向进程发送信号
对学习Linux中信号的发送,掌握这几种信号发送方法就足够了。