有关 “Unix 信号不排队”的问题

2018-08-05 22:02:10 +08:00
 RingoTC

题目描述

在《 CSAPP 》中有一个简单的 signal 示例程序。我在 Ubuntu 里编译运行相同的代码,得到的结果和书上给出的结果不一样,并且就是在最关键的一个地方不一样:信号不排队。

而我在自己的机器上编译运行结果:

按照书里面的说法,Handler reaped child 这一项应该只出现两次。

相关代码

#include "csapp.h"
/* $begin signal1 */
/* WARNING: This code is buggy! */

void handler1(int sig) 
{
    int olderrno = errno;

    if ((waitpid(-1, NULL, 0)) < 0)
        sio_error("waitpid error");
    Sio_puts("Handler reaped child\n");
    Sleep(1);
    errno = olderrno;
}

int main() 
{
    int i, n;
    char buf[MAXBUF];

    if (signal(SIGCHLD, handler1) == SIG_ERR)
        unix_error("signal error");

    /* Parent creates children */
    for (i = 0; i < 3; i++) {
        if (Fork() == 0) {
            printf("Hello from child %d\n", (int)getpid());
            exit(0);
        }
    }

    /* Parent waits for terminal input and then processes it */
    if ((n = read(STDIN_FILENO, buf, sizeof(buf))) < 0)
        unix_error("read");

    printf("Parent processing input\n");
    while (1)
        ;

    exit(0);
}
/* $end signal1 */

2248 次点击
所在节点    问与答
7 条回复
redsonic
2018-08-06 00:15:27 +08:00
内核中的信号处理和进程调度有关联性,一般都是计时上的问题,我试了两台空闲的都和书上的一样,打印两次。然后生成子进程的时候延迟错开一下就打印三次了,exit 的时候不容易撞到。不必纠结,也许你系统繁忙 /空闲的时候结果会不一样,明白道理就行了。
/* Parent creates children */
for (i = 0; i < 3; i++) {
usleep(100)
if (Fork() == 0) {
manifold
2018-08-06 02:19:35 +08:00
这个本身就取决于进程调度(因为 signal 是在陷入内核是 handle 的)。。所以理论上可以出现各种情况。因此要用 waitpid 来回收 zombie processes
ryd994
2018-08-06 02:21:44 +08:00
你是不是在虚拟机里,而且是单核虚拟机?
RingoTC
2018-08-06 03:07:03 +08:00
@ryd994 是在 wsl 里面
ryd994
2018-08-06 06:50:09 +08:00
@RingoTC ………………
你都没有在用 Linux 还有什么好说的呢?
wsl 是 Windows 内核+syscall 翻译
x86vk
2018-08-06 08:07:22 +08:00
@RingoTC wsl 还不能完全兼容 posix 规范,特别是线程,文件这种
RingoTC
2018-08-06 13:12:15 +08:00
@ryd994 好吧...一直以为 wsl 就是单纯的虚拟机,只是更方便而已....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/477097

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX