四、信号屏蔽字:
有时候我们希望进程正确的执行,而不想进程受到信号的影响,比如我们希望上面那个程序在1秒钟之后不结束。这个时候我们就要进行信号的操作了。
信号操作最常用的方法是信号屏蔽。信号屏蔽要用到下面的几个函数。
sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask。下面对他们分别进行讲解。
8.
名称:: |
sigemptyset/sigfillset/sigaddset/sigdelset/sigismember |
功能: |
处理信号集 |
头文件: |
#include <signal.h> |
函数原形: |
int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set,int signum); int sigdelset(sigset_t *set,int signum); int sigismember(const sigset_t *set,int signum); |
参数: |
set 信号集 signum 信号 |
返回值: |
若成功返回0,若出错返回-1。 若真返回1,若假返回0,若出错返回-1。 sigismember |
我们需要有一个能表示多个信号—信号集的数据类型。我们将在诸如sigprocmask之类的函数中使用这种数据类型,以便告诉内核不允许发生该信号集中的信号。上面的5个函数可以对信号集进行处理。
函数sigemptyset 初始化由set指向的信号集,清除其中所有信号。函数sigfillset初始化由set指向的信号集,使其包含所有信号。所以信号在使用信号集前,要对信号集调用sigemptyset或sigfillset一次。
函数sigaddset 将一个信号添加到现有集中,sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,我们总是以信号集地址作为其传送的参数。
sigismember查询信号是否在信号集合之中。
下面的例子:
/*10_7.c*/ #include <stdio.h> #include <signal.h>
main() { sigset_t *set; set=(sigset_t*)malloc(sizeof(set));
sigemptyset(set);/*初始化信号集*/ sigaddset(set,SIGUSR1);/*添加信号SIGUSR1到信号集中*/ sigaddset(set,SIGINT);/*添加信号SIGUSR2到信号集中*/
if((sigismember(set,SIGUSR1))==1)/*测试信号SIGUSR1是否在信号集中*/ printf(“SIGUSR1/n”); if((sigismember(set,SIGUSR2))==1) printf(“SIGUSR2/n”); if((sigismember(set,SIGINT))==1) printf(“SIGINT/n”); } |