信号#2

作者: 无无吴 | 来源:发表于2019-09-26 07:39 被阅读0次

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);
``




相关文章

  • 信号#2

    Sending a Signal发送一个信号 如果pid>0,那么经发送给pid对应的那个进程。如果pid=0,那...

  • 信号(2)

    其实,以前为了不让大宝看电视,我也是经常出此下策的。

  • 《信号》2

    听到这个声音换了语言,我愣了几秒钟。接着感到惊恐,瞪大眼睛四处搜寻发声者,一边想,“天哪,刚刚变化的声音不会是对我...

  • 1.4 电子元器件的调试

    1、数字信号输出 2、数字信号输入 3、模拟信号输出 4、模拟信号输入 5、I2C

  • iOS_RAC进阶学习

    一、信号合并 (1)信号合并_Merge (2)信号合并_CombineLatest (3)信号合并_concat...

  • 16.信号集,信号的阻塞

    1.信号集,其中1-31是不可靠的信号,其后的是可靠的信号。 2.信号的阻塞 信号2和信号3 将被阻塞30秒钟,随...

  • RAC基本用法

    1.信号的创建、订阅和发送 1.1创建信号 1.2 订阅信号 1.3 合并到一块的写法 2.RAC信号的监听 2....

  • 有关RAC源码知识梳理

    RACSignal :1,创建信号2,信号的订阅3,发送信号4,信号销毁 下面每一步我们细细道来: 1、创建信号 ...

  • 陌生信号(2)

    “把你这把臭枪收起来!”其中一个人用纯正的美式英语低声吼道。章风浑身发抖,脑袋却异常清醒,每一秒在他面前,都放...

  • [iOS][RAC]--RACSignal类发送信号过程的低层实

    一、简单的实现步骤套路:1、创建信号(冷信号!)2、订阅信号(热信号!!)3、发送数据subscriber它来发送...

网友评论

      本文标题:信号#2

      本文链接:https://www.haomeiwen.com/subject/hvlvuctx.html