信号#2

Sending a Signal发送一个信号

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo);

如果pid>0,那么经发送给pid对应的那个进程。
如果pid=0,那么将发送给进程组里的每个进程。
如果pid=-1,那么将发送给除了自己和init之外的每个进程。
如果pid<-1,那么就发送给进程组-pid。
成功调用返回0,失败返回-1,并设置errno。

权限

拥有CAP_KILL权限的进程可以发送一个信号Signal给任意进程。
如果没有这个能力,那么发送进程的effective或real user ID必须与接收信号的进程相同。
简单来说就是一个用户只能给自己拥有的进程发送信号。
如果signal=0,那么调用将不发送任何信号,但他仍然会进行错误检查,这通常被用来进程检查是否有权限发送信号给被提供的进程。

Examples

int ret;
    ret = kill (1722, SIGHUP);
if (ret)
    perror ("kill");
int ret;
ret = kill (1722, 0);
    if (ret)
        ; /* we lack permission */
    else
        ; /* we have permission */

给自己发送信号

#include <signal.h>
int raise(int signo);
raise(signo) == kill(getpid(), signo)

成功返回0,失败返回非0,但不设置errno。

发送一个信号给整个进程组

#include <signal.h>
int killpg(int pgrp, int signo);
killpg(pgrp,signal) == kill(-pgrp, signo)

成功返回0,失败返回-1,并设置errno。

Reentrancy折返性,重入性

保证可重入的函数

保证可以安全重入的函数#1

保证可以安全重入的函数#2

信号集Signal Sets

#include <signal.h>
int sigemptyset (sigset_t *set);
int sigfillset (sigset_t *set);
int sigaddset (sigset_t *set, int signo);
int sigdelset (sigset_t *set, int signo);
int sigismember (const sigset_t *set, int signo);

sigemptyset()初始化set给出的信号集,并将其标记为空(所有信号被排除在外)。
sigfillset()初始化set给出的信号集,并将其标记为满(所有set中的信号)。
这两个函数都返回0。你应该在用信号集之前调用其中的一个。
sigaddset()往set中加入一个signo。
sigdelset()往set中移除一个signo。
这两个函数都是成功返回0,失败函数-1,并设置errno。
sigismember()如果signo是这个signo set中的则返回0,不然返回-1,并设置errno。

更多的信号集函数

#define _GNU_SOURCE
#define <signal.h>
int sigisemptyset (sigset_t *set);
int sigorset (sigset_t *dest, sigset_t *left, sigset_t *right);
int sigandset (sigset_t *dest, sigset_t *left, sigset_t *right);

如果set给出的信号集为空,则sigisemptyset()返回1,否则为0。
sigorset()将信号集left和right的联合(二进制或)放置在dest中。
sigandset()将信号集的left和right的交集(二进制和)放置在dest中
这两个函数成功返回0。失败返回-1,并设置errno。

Blcoking Signals阻塞信号

#include <signal.h>
int sigprocmask (int how, const sigset_t *set, sigset_t *oldset);

how的参数如下:

  • SIG_SETMASK
    调用进程的信号掩码被更改为设置。
  • SIG_BLOCK
    集合中的信号被添加到调用进程的信号掩码中。换句话说,信号掩码被更改为当前掩码和设置的合并(二进制OR)。
  • SIG_UNBLOCK
    集合中的信号从调用进程的信号掩码中删除。换句话说,信号被改变为当前掩码的交集(二进制和),和否定(二进制非)的set。 打开一个没有被阻塞的信号是非法的。
    如果oldset不是NULL,则函数将前面的信号集放在oldset中。
    如果set为NULL,则函数将忽略how,也不会更改信号掩码,但它确实将信号掩码放置在旧集中。换句话说,将空值作为set传递是检索当前信号掩码的一种方式。
    不允许阻塞SIGKILL或SIGSTOP。Sigpromask()静默地忽略试图将其中一个信号添加到信号掩码中的行为。

检索待测信号

#include <signal.h>
int sigpending (sigset_t *set);

成功地调用sigpending()时,将挂起的信号集中到set中,并返回0。失败时,调用返回−1并将errno设置为EFAULT,这意味着SET是无效指针。

等待信号集

#include <signal.h>
int sigsuspend(const sigset_t *set);
``




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • 使用场景:1、为了并发,中断处理其它事件,1、进程间通信1、中断中止(注意不是终止)当前正在执行的程序,转而执行其...
    奥斯特洛司机阅读 688评论 0 0
  • 信号是事件发生时对进程的通知机制,又称为软中断。当程序正常运行时,如果收到一个信号,那么程序的运行流程会被打断,等...
    loopppp阅读 431评论 0 0
  • 信号:信号的发送函数/信号集和信号屏蔽/介绍一个sigaction()/信号应用的相关函数:sleep(),usl...
    vera姐姐阅读 247评论 0 0
  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,455评论 1 14
  • 有朋友开古琴公益课,几次喊我有时间过去看看。下午去体验了一下。 去的时候已有六个人在,包括一位十岁的小姑娘,是跟她...
    玉见欢喜阅读 428评论 4 5