Linux—信号的发送

信号的发送函数

前面介绍了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中信号的发送,掌握这几种信号发送方法就足够了。

发布了62 篇原创文章 · 获赞 188 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43743762/article/details/101312319