LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1554|回复: 8

[提问]关于sigprocmask()

[复制链接]
发表于 2007-7-23 14:36:37 | 显示全部楼层 |阅读模式
看了APUE里们关于sigprocmask(int how, const sigset_t *restrict set, sigset_t * restrict oset)

函数的介绍,感觉还是一头雾水T_T

不清楚这个函数到底做什么用的(尤其函数里面的how, 和oset不知道该如何去用),和sigpending

函数有什么区别呢?

谁能给我详细讲讲呢,T_T
发表于 2007-7-23 18:35:51 | 显示全部楼层
我觉得APUE里已经讲得很清楚了
sigprocmask:
如果oset不是NULL指针的话,当前的signal mask会保存到这里
如果set不是NULL指针的话,第一个参数how决定了怎么处理set所包含的signal mask的处理方式
how共有三个值:
SIG_BLOCK     设置当前的signal mask为set和原有signal mask的并集
SIG_UNBLOCK  set是我们想从原有signal mask中unblock掉的信号
SIG_SETMASK   用set来替换原有的signal mask.

sigprocmask就是用一个函数就得到当前的signal mask,对它进行修改。
sigpending就是得到当前blocked和pending的信号

说白了就是sigprocmask干得活可以比sigpending多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-23 19:26:03 | 显示全部楼层
谢谢你的解答
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. //#include <>
  6. static void sig_quit(int signo)
  7. {
  8.         printf("caught SIGQUIT\n");
  9.         signal(SIGQUIT, SIG_DFL);
  10. }
  11. int main()
  12. {
  13.         sigset_t newmask;
  14.         sigset_t oldmask;
  15.         sigset_t pendmask;
  16.         signal(SIGQUIT, sig_quit);
  17.         sigemptyset(&newmask);
  18.         sigaddset(&newmask, SIGQUIT);
  19.         sigprocmask(SIG_BLOCK, &newmask, &oldmask);
  20.         sleep (5);
  21.         sigpending(&pendmask);
  22. //        sleep (5);
  23.         if (sigismember(&pendmask, SIGQUIT))
  24.         {
  25.                 printf("\nSIGQUIT pending\n");
  26.         }
  27.         sigprocmask(SIG_SETMASK, &oldmask, NULL);
  28.         printf("SIGQUIT unblocked\n");
  29.         sleep(5);
  30.         return (0);
  31. }
复制代码

APUE的例子,sigprocmask 暂时不接受了用sigaddset()添加到newmask里的SIGQUIT信号,可

是,里面的oldmask又是做什么用的呢?希望能解答一下~

还有就是:
  1. if (sigismember(&pendmask, SIGQUIT))
复制代码

里面的pendmask 什么时候被加进了SIGQUIT信号呢?
回复 支持 反对

使用道具 举报

发表于 2007-7-24 01:39:55 | 显示全部楼层
一:oldmask就相当于oset,用于返回当前屏蔽的信号集
二:pendmask是由sigpending返回的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-24 09:35:32 | 显示全部楼层
哦,这样的话,我明白了,sigpending()函数就是为了挂起这个进程,然后看看有没有信号过来,

如过有信号的话就返回这个信号状态。

呵呵,谢谢大家的教导~
回复 支持 反对

使用道具 举报

发表于 2007-7-24 11:45:56 | 显示全部楼层
Post by sunorr
哦,这样的话,我明白了,sigpending()函数就是为了挂起这个进程,然后看看有没有信号过来,

如过有信号的话就返回这个信号状态。

呵呵,谢谢大家的教导~
仔细看看书~~~~~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-24 14:04:39 | 显示全部楼层
sigpending 应该是当sigprocmask()设置SIG_BLOCK的时候,如果有信号过来的话,

先“pending” 起来,等到sigprocmask()设置SIG_UNBLOCK的时候再处理这个信号。这样理解对

不?
回复 支持 反对

使用道具 举报

发表于 2007-7-25 01:13:30 | 显示全部楼层
Post by sunorr
sigpending 应该是当sigprocmask()设置SIG_BLOCK的时候,如果有信号过来的话,

先“pending” 起来,等到sigprocmask()设置SIG_UNBLOCK的时候再处理这个信号。这样理解对

不?

sigpending只是返回当前被阻塞而未决的信号集,
如果有信号过来的话,

先“pending” 起来
是内核做的工作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-25 10:40:37 | 显示全部楼层
晓得了,谢谢哈*^_^* ~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表