进入信号处理函数,是不是会自动把进入信号加入信号屏蔽字?还有sigpending

c_o_o_l_u_l_u 2012-09-03 05:53:34
大神们,求详解!
...全文
218 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
NJPaul 2012-09-04
  • 打赏
  • 举报
回复
虽然标准没有这样的要求,但是Linux的实现应该是这样的。
推荐你看一下《Unix环境高级编程》里面跟信号有关的内容。

我也是刚开始学习Linux,所以不能直接回答你的问题。
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

菜就菜在你不仅不会,而且不愿意虚心主动的学习。

。。。怎么遇到这种人,回答个问题还要加点情绪。man要是我看懂了还会来这里问?
你高手,看man就懂。
我菜,看man不懂还要问人,问人还要被吊一顿才能换来一知识。。。好,等价交换
[/Quote]
你回答我的问题就行了
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

菜就菜在你不仅不会,而且不愿意虚心主动的学习。

。。。怎么遇到这种人,回答个问题还要加点情绪。man要是我看懂了还会来这里问?
你高手,看man就懂。
我菜,看man不懂还要问人,问人还要被吊一顿才能换来一知识。。。好,等价交换
[/Quote]
你回答我的问题就行了
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

菜就菜在你不仅不会,而且不愿意虚心主动的学习。
[/Quote]
。。。怎么遇到这种人,回答个问题还要加点情绪。man要是我看懂了还会来这里问?
你高手,看man就懂。
我菜,看man不懂还要问人,问人还要被吊一顿才能换来一知识。。。好,等价交换

fdl19881 2012-09-04
  • 打赏
  • 举报
回复
这就对了嘛,,
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

sigset_t set;

void print(int signo)
{
printf("handle SIGINT in print()!!!\n");
}

void catch(int signo)
{
printf("\nin catch()...\n");
signal(SIGINT, print);
sleep(5);
sigpending(&set);
if(sigismember(&set, SIGINT))
printf("block SIGINT!!!\n");
printf("out catch()...\n");
}

int main()
{
signal(SIGINT, catch);
while(1)
{
printf("in main()...\n");
sleep(1);
}
}

coolulu@ubuntu:~/code/syscall$ ./signal1
in main()...
in main()...
^C
in catch()...
^C^C^Cblock SIGINT!!!
out catch()...
handle SIGINT in print()!!!
in main()...
in main()...
in main()...
^Chandle SIGINT in print()!!!
in main()...
^Chandle SIGINT in print()!!!
in main()...
^Chandle SIGINT in print()!!!
in main()...
^\Quit
coolulu@ubuntu:~/code/syscall$


c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
printf("in main\n");sleep(1); 改成printf("in main\n"),sleep(1);
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 11 楼 的回复:

引用 10 楼 的回复:

引用 1 楼 的回复:

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?


你的这句话本身就是错误的,,看看APUE相应章节的例子,看懂例子就明白了。

一般情况linux signal注册信号后,然后产生信号进入相应的信号处理程序时,是会自动bl……
[/Quote]

include <stdio.h>
#include <signal.h>
#include <unistd.h>

void print(int signo)
{
printf("in handle has SIGINT!!!\n");
}

void catch(int signo)
{
printf("catch in..\n");
signal(SIGINT, print);
while(1)
sleep(1);
printf("catch out..\n");
}

int main()
{
signal(SIGINT, catch);
while(1)
printf("in main\n");sleep(1);
}

coolulu@ubuntu:~/code/syscall$ ./signal1
in main()
in main()
in main()
in main()
in main()
in main()
^Ccatch in..
^C^C^C^C^C^C^C^C^C
^\Quit
coolulu@ubuntu:~/code/syscall$

这样说明了在 信号处理函数catch中^C被block,
在信号处理函数catch中的 signal(SIGINT, print)永远收不到^C



fdl19881 2012-09-04
  • 打赏
  • 举报
回复
如果马上出现printf就说明信号处理程序中已经将自身阻塞了。改成
如果马上出现printf就说明信号处理程序中没将引起自身调用的信号阻塞。

实践出真理。。APUE上好像有这样的例子,你要么就没看APUE,要么就是懒得动手验证他的例子的人。
fdl19881 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 1 楼 的回复:

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?


你的这句话本身就是错误的,,看看APUE相应章节的例子,看懂例子就明白了。

一般情况linux signal注册信号后,然后产生信号进入相应的信号处理程序时,是会自动block该信号,,信号处理函数结束时……
[/Quote]

自己写个代码实验。
fdl19881 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 1 楼 的回复:

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?


你的这句话本身就是错误的,,看看APUE相应章节的例子,看懂例子就明白了。

一般情况linux signal注册信号后,然后产生信号进入相应的信号处理程序时,是会自动block该信号,,信号处理函数结束时……
[/Quote]

实现一下嘛,,在信号处理程序里面进入时printf,接着sleep(5),在printf结束,然后先按下比如用的是SIGINT,,先按下ctrl+c,,中断处理程序运行,打印,sleep,,再接着按下ctrl+c,,如果马上出现printf就说明信号处理程序中已经将自身阻塞了。
实践!感觉你APUE基本没看明白
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 1 楼 的回复:

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?


你的这句话本身就是错误的,,看看APUE相应章节的例子,看懂例子就明白了。

一般情况linux signal注册信号后,然后产生信号进入相应的信号处理程序时,是会自动block该信号,,信号处理函数结束时自动unblock,,

si……
[/Quote]
进入信号处理函数 会自动 把进入信号加入信号屏蔽字
fdl19881 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?
[/Quote]

你的这句话本身就是错误的,,看看APUE相应章节的例子,看懂例子就明白了。

一般情况linux signal注册信号后,然后产生信号进入相应的信号处理程序时,是会自动block该信号,,信号处理函数结束时自动unblock,,

sigpending
因为信号被阻塞时,如果产生了已经被阻塞的信号,则这些信号处理未决状态,不会调用其信号处理程序。这个时候使用sigpending就能够得出此时未决状态的信号 。

慢慢看APUE,,特别是例子要看懂,看明白。最好自己敲出代码试验,思考 。
c_o_o_l_u_l_u 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

虽然标准没有这样的要求,但是Linux的实现应该是这样的。
推荐你看一下《Unix环境高级编程》里面跟信号有关的内容。

我也是刚开始学习Linux,所以不能直接回答你的问题。
[/Quote]
就是看了apue没看懂
qq120848369 2012-09-03
  • 打赏
  • 举报
回复
菜就菜在你不仅不会,而且不愿意虚心主动的学习。
c_o_o_l_u_l_u 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, s……
[/Quote]
我菜好吧,至少你说的man我看过。请解释sigspending
qq120848369 2012-09-03
  • 打赏
  • 举报
回复
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}

sa_mask gives a mask of signals which should be blocked during execution of the signal handler. In addition, the signal which triggered the handler will be
blocked, unless the SA_NODEFER or SA_NOMASK flags are used.


       The  sigpending  call allows the examination of pending signals (ones which have been raised while blocked).  The signal mask of pending signals is stored in
set.


The sigpending call allows the examination of pending signals (ones which have been raised while blocked). The signal mask of pending signals is stored in
set.


不会用manpage,不会读英文, 干脆别搞linux了。
c_o_o_l_u_l_u 2012-09-03
  • 打赏
  • 举报
回复
是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧