zoukankan      html  css  js  c++  java
  • 进程间通信--POSIX信号量

    1.未决阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,
    在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。
    阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略。

    2.sigset--装信号的容器
    信号能被装进容器吗?能。
    为什么需要容器来装信号?其实还是方便 linux 内核处理信号,当然也方便用户程序处理。试想一下,如果同时发送了好多不同的
    信号给进程,然而进程一次只能处理一个信号,所以进程得把接收到的信号先保存起来才行。

    3. sigset_t
    POSIX定义一个数据结构—— sigset_t ,typedef定义的数据类型,一个64位宽度的整数,是一个信号集合。信号的编号是从1到64这个范围。
    而sigset_t正好是一个64位整数,所以有时候sigset_t也被称为信号位图。

    操作 sigset_t 的函数
    操作sigset_t的函数主要有 5 个。
    sigemptyset (清空集合,所有比特位置 0)
    sigfillset (填充集合,所有比特位置 1)
    sigaddset (添加信号到集合,将某一比特位置 1)
    sigdelset (删除某个信号,将某一比特位置 0)
    sigismember (是否存在某个信号,判断某一比特位是否为 1)


    3.1 打印sigset_t的函数
    void printsigset(const sigset_t *set)
    {
    for (int i = 1; i <= 64; i++) {
    if (i==33) putchar(' ');
    if (sigismember(set, i) == 1)
    putchar('1');
    else
    putchar('0');
    }
    puts("");
    }

    3.2 填充sigset_t
    sigfillset(&st);
    printsigset(&st);
    结果:
    11111111111111111111111111111110 01111111111111111111111111111111

    3.3 清空sigset_t
    sigemptyset(&st);
    printsigset(&st);
    结果:
    00000000000000000000000000000000 00000000000000000000000000000000

    3.4 添加信号
    sigaddset(&st, SIGHUP);
    sigaddset(&st, SIGINT);
    sigaddset(&st, SIGKILL);
    sigaddset(&st, SIGSYS);
    sigaddset(&st, SIGRTMIN);
    sigaddset(&st, SIGRTMAX);
    printsigset(&st);
    上面这段代码一共添加了 6 个不同的信号,可以发现信号对应的比特位都被置1了。
    结果:
    11000000100000000000000000000010 01000000000000000000000000000001

    3.5 删除信号
    sigdelset(&st, SIGKILL);
    printsigset(&st);
    这里只删除了信号 9(SIGKILL),发现第 9 个比特位被置 0了。
    结果:
    11000000000000000000000000000010 01000000000000000000000000000001

    3.6 判断集合里是否存在某个信号
    if (sigismember(&st, SIGKILL)) {
    printf("SIGKILL is member ");
    }
    if (sigismember(&st, SIGINT)) {
    printf("SIGINT is member ");
    }
    结果:因为 SIGKILL 刚刚被删除了,所以这里只打印了 SIGINT.
    SIGINT is member

    待看:http://blog.csdn.net/zhangxiao93/article/details/52583127

    http://blog.csdn.net/anonymalias/article/details/9219945

  • 相关阅读:
    SDUT-3376_数据结构实验之查找四:二分查找
    SDUT-3375_数据结构实验之查找三:树的种类统计
    SDUT-3373_数据结构实验之查找一:二叉排序树
    深度优先遍历和广度优先遍历
    SDUT-2498_AOE网上的关键路径
    SDUT-2140_判断给定图是否存在合法拓扑序列
    SDUT-2144_最小生成树
    SDUT-3364_欧拉回路
    SDUT-3363_驴友计划
    Java练习 SDUT-2271_Eddy的难题
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/8041003.html
Copyright © 2011-2022 走看看