首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >叉子+等待在OSX上获得EINTR

叉子+等待在OSX上获得EINTR
EN

Stack Overflow用户
提问于 2013-12-12 22:25:38
回答 2查看 1.1K关注 0票数 4

我在101号分岔处不及格。我希望这样可以分叉一个子进程,并输出子进程和父printfs:

代码语言:javascript
复制
pid_t fpid;

if ((fpid = fork()) < 0)
{
    printf("fork: %s\n", strerror(errno));
    exit(-1);
}

if (0 == fpid) // child
{
    printf("\nI am the child\n");
}
else
{
    printf("\nI am the parent\n");
    pid_t wpid;
    while ((wpid = waitpid(WAIT_ANY, NULL, 0)))
    {
        if (errno == ECHILD)
            break;
        else if (wpid < 0)
            printf("wait: %s\n", strerror(errno));
    }
}

相反,我得到了这个输出:

我是家长 等待:中断的系统呼叫

所以我的问题是:为什么孩子没有机会生活和逃跑?有人能不能想想孩子们!另外,EINTR是从哪里来的?显然,这与我的第一个问题有关。

此外,当我在一个独立的程序中运行该代码时,它工作正常,但在我的一个较大的程序中却不能正常工作;更大的程序能做什么来扰乱waitpid呢?

这是在OSX 10.9上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 23:19:46

在OSX上,在叉的子侧做很多事情是不合法的。请参阅叉子手册页底部的警告。安全函数的列表在σ(2)手册页上。printf()不在其中。

此外,stdout可能会被缓冲。printf()的结果可能不会被刷新。如果您调用exit(),它将被刷新,但是在叉子的子端也是不合法的。(使用_exit()是合适的,但这不会刷新打开的流。)实际上,您似乎没有退出您的子进程,这意味着执行流继续到您所显示的代码的调用方,可能返回到您程序的其余部分。它可能被卡在那里,因为儿童一侧的叉子的限制。

如果你在孩子身上做这样的事情,你可能会有更多的运气:

代码语言:javascript
复制
const char msg[] = "\nI am the child\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
_exit(0);

最后,我认为您应该将fpid而不是WAIT_ANY传递给waitpid()。您有要等待的特定子进程。在较大程序的上下文中,您不希望窃取由其他子组件生成的子程序终止的通知。而且,您总是需要在可中断的系统中循环,直到它们返回EINTR以外的内容为止。

票数 4
EN

Stack Overflow用户

发布于 2013-12-13 05:50:24

仅检查errno是否有故障指示,例如,系统调用返回-1

代码应该如下所示:

代码语言:javascript
复制
pid_t fpid;

if ((fpid = fork()) < 0)
{
    printf("fork: %s\n", strerror(errno));
    exit(-1);
}

if (0 == fpid) // child
{
    printf("\nI am the child\n");
}
else
{
    printf("\nI am the parent\n");

    pid_t wpid;
    while ((wpid = waitpid(WAIT_ANY, NULL, 0)))
    {
        if (-1 == wpid)
        {
            perror("waitpid() failed");
        }
        else if (wpid == fpid)
        {
            /* My child ended, so stop waiting for it. */
            break;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20555550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档