二 Linux进程间通信( 五 )

未决信号集操作函数——sigpending:
#include<signal.h>int sigpending(sigset_t *set);功能:读取当前进程的未决信号集参数:set:未决信号集返回值:成功:0失败:-1代码示例:
实验一:把进程中信号屏蔽字2号信号进行阻塞,然后每隔1s对未决信号集进行打印,观察现象 。
#include <stdio.h>#include <unistd.h>#include <signal.h>void PrintPending(sigset_t* pend){int i = 0;for (i = 1; i < 32; ++i){if (sigismember(pend, i)){printf("1");}else{printf("0");}}printf("\n");}int main(){sigset_t set, oset;sigset_t pending;// 使用系统函数对信号集进行初始化sigemptyset(&set);sigemptyset(&oset);sigemptyset(&pending);// 阻塞2号信号// 先用系统函数对set信号集进行设置sigaddset(&set, 2);// 使用sigprocmask函数更改进程的信号屏蔽字// 第一个参数,三个选项:SIG_BLOCK(mask |= set) SIG_UNBLOCK(mask &= ~set) SIG_SETMASK(mask = set)sigprocmask(SIG_BLOCK, &set, &oset);int flag = 1; // 表示已经阻塞2号信号int count = 0;while (1){// 使用sigpending函数获取pending信号集sigpending(&pending);// 打印pending位图PrintPending(&pending);sleep(1);}return 0;}运行结果如下:
可以看到,进程收到2号信号时,且该信号被阻塞,处于未决状态,未决信号集中2号信号对应的比特位由0置1

二 Linux进程间通信

文章插图
实例2: 将上面的代码进行修改,进行运行10s后,我们将信号屏蔽字中2号信号解除屏蔽
#include <stdio.h>#include <unistd.h>#include <signal.h>void PrintPending(sigset_t* pend){int i = 0;for (i = 1; i < 32; ++i){if (sigismember(pend, i)){printf("1");}else{printf("0");}}printf("\n");}int main(){sigset_t set, oset;sigset_t pending;// 使用系统函数对信号集进行初始化sigemptyset(&set);sigemptyset(&oset);sigemptyset(&pending);// 阻塞2号信号// 先用系统函数对set信号集进行设置sigaddset(&set, 2);// 使用sigprocmask函数更改进程的信号屏蔽字// 第一个参数,三个选项:SIG_BLOCK(mask |= set) SIG_UNBLOCK(mask &= ~set) SIG_SETMASK(mask = set)sigprocmask(SIG_BLOCK, &set, &oset);int flag = 1; // 表示已经阻塞2号信号int count = 0;while (1){// 使用sigpending函数获取pending信号集 sigpending(&pending); // 打印pending位图 PrintPending(&pending); if (++count == 10){// 两种方法都可以sigprocmask(SIG_UNBLOCK, &set, &oset);//sigprocmask(SIG_SETMASK, &oset, NULL); }sleep(1);}return 0;}运行结果如下:
二 Linux进程间通信

文章插图
信号2被阻塞之后就变成了未决状态,当该信号从阻塞集合中解除的时候,该信号就会被处理,该信号被处理后,该信号的未决信号集的标志位将从1置为0 。
信号的捕获一个进程收到一个信号的时候,可以用以下的方法进行处理:
(1)执行系统默认动作:对大多数信号来说,系统默认动作就是来终止进行 。
(2)忽略此信号(丢弃):接收到此信号后没有任何动作
(3)执行自定义信号处理函数(捕获):用户定义的信号处理函数处理该信号
注意:SIGKILL和SIGSTOP不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法 。
信号捕捉的过程先思考一个问题:信号是什么时候被进程处理的?
首先,不是立即被处理的 。而是在合适的时候,这个合适的时候,具体指的是进程从用户态切换回内核态时进行处理
这句话如何理解,什么是用户态?什么是内核态?