免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3570 | 回复: 11
打印 上一主题 下一主题

苯苯的问----为什么要阻塞一个信号? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-13 01:04 |只看该作者 |倒序浏览
信号发出后如果接收者在一定时间内接收不到的话是不是此信号会丢失?
阻塞一些信号有什么好处?
我刚刚学APUE,如此弱智问题实在不好意思,但是我想了一晚都不太明白。

论坛徽章:
0
2 [报告]
发表于 2003-12-13 01:55 |只看该作者

苯苯的问----为什么要阻塞一个信号?

每个进程都联系一组信号,对于每个信号有一个BIT表示该信号是否被阻塞,如果被阻塞,那么该信号就一直等待直到阻塞位被清除,如果与此同时同样的信号来到,那么这个新到的信号就丢失了.
信号阻塞用于保护某段程序不受信号的干扰,等这段程序完成了,再解除阻塞。

论坛徽章:
0
3 [报告]
发表于 2003-12-13 11:46 |只看该作者

苯苯的问----为什么要阻塞一个信号?

static volatile sig_atomic_t    sigflag = 0;
static sigset_t         zeromask;

int
main (void) {
        int     i, j;
        pid_t   pid;

        signal(SIGUSR1, sig_usr);
        signal(SIGUSR2, sig_usr);


        if( (pid=fork()) < 0 )
                err("fork error";
        else if (pid == 0 ) {

                for(i = 0; i< 100; i++){
                        while(sigflag == 0 )
                                sigsuspend(&zeromask);
                        sigflag = 0;
                        printf("c  ";                  
                        kill (getppid(), SIGUSR1);
                }
        }
        else {
     
                for(i = 0;i < 100; i++ ) {              
                        printf("p  ";
                        kill(pid, SIGUSR2);
                        while(sigflag == 0)
                                sigsuspend(&zeromask);
                        sigflag = 0;

                }
        }

        exit(0);
}

这段程序为什么打印出来的是"pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"?
而不是一个p一个c这样轮换?

论坛徽章:
0
4 [报告]
发表于 2003-12-13 18:17 |只看该作者

苯苯的问----为什么要阻塞一个信号?

没人愿意解答第2问?

论坛徽章:
0
5 [报告]
发表于 2003-12-13 21:33 |只看该作者

苯苯的问----为什么要阻塞一个信号?

你的程序能打印东西吗?我怎么打印不了?

论坛徽章:
0
6 [报告]
发表于 2003-12-13 21:53 |只看该作者

苯苯的问----为什么要阻塞一个信号?

try this one

/*alter.c*/

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

int
main (void) {
int i, j;
pid_t pid;

if( (pid=fork()) < 0 )
err("fork error";
else if (pid == 0 ) {

for(i = 0; i< 100; i++){
sleep(1);
while(1) pause();  
printf("c ";
kill (getppid(), SIGUSR1);
}
}
else {

for(i = 0;i < 100; i++ ) {
printf("p ";
kill(pid, SIGUSR1);
sleep(1);
while(1) pause();
}
}

exit(0);
}

论坛徽章:
0
7 [报告]
发表于 2003-12-15 19:49 |只看该作者

苯苯的问----为什么要阻塞一个信号?

如果学过操作系统,就知道进程被CPU调度的方式,例如时间片轮转。在你第二个问题里面,父子进程在宏观上是一起运行的,但是微观上不是同时被CPU使用的,而是轮流被CPU调度的,所以会出现父进程运行完后,子进程再运行这样的情况。rabbit的程序中加了sleep和pause,使进程暂时挂起,此时进程中CPU中退出,交给其他的进程,因此理论上是对的(实际上我没仔细看,不知对不对,^_^)

论坛徽章:
0
8 [报告]
发表于 2003-12-16 05:11 |只看该作者

苯苯的问----为什么要阻塞一个信号?

sigsuspend() 按理说是使进程悬挂起来,直到有信号进来。
为什么 翼下之风   的程序是父进程先打印p 而后子进程打印c ,我也晕,他的程序中sig_usr() 这个trap函数没定义,我想应该是改变sigflag 的值吧。

论坛徽章:
0
9 [报告]
发表于 2003-12-29 21:07 |只看该作者

苯苯的问----为什么要阻塞一个信号?

我找到原因了,那是输出缓冲的问题。printf()有个缓冲,如果把它关掉就可以实现p和c间隔输出了。

论坛徽章:
0
10 [报告]
发表于 2003-12-30 10:39 |只看该作者

苯苯的问----为什么要阻塞一个信号?

APUE白看了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP