【问题标题】:waitpid() returns -1 if fopen() exists如果 fopen() 存在,waitpid() 返回 -1
【发布时间】:2014-10-20 22:56:45
【问题描述】:

我想知道为什么 waitpid() 存在而 fopen() 返回 -1。

FILE *fp = fopen ("abc.txt", "r");
fclose(fp);

pid_t pid = fork ();
if (pid == 0) { /* child process */
    printf ("child %d\n", getpid());
}
else {                  /* parent process */
    pid_t pid2 = waitpid (pid);
    printf ("parent %d\n", pid2);
}

pid2 等于上例中的 -1,但如果我消除 fopen(),它将变为与 pid(子进程号)相同的数字。 感谢您的澄清!

【问题讨论】:

    标签: c process fopen waitpid


    【解决方案1】:

    您忽略了错误,因此无法分辨。

    我的最佳猜测是您的waitpid 呼叫被死去孩子的 CHLD 信号中断。

    测试错误代码以确保:

    int status;
    pid_t pid2;
    while ((p = waitpid(pid, &status, 0)) == -1)
    {
        printf("waitpid error: %s\n", strerror(errno));
    }
    printf("reaped child: %d\n", pid2);
    

    如果您不关心SIGCHLD,请在进行分叉之前阻止信号。

    【讨论】:

    • 感谢您的快速回复!如果我使用waitpid(pid, &status, 0),代码可以正常工作。我不知道为什么我可以在没有fopen() 的情况下使用waitpid(pid)
    • @user1322538:你在写 1972 风格的 C 吗?这没有经过类型检查,因此有责任阅读手册并找出您的系统 API。
    • 那是我的错,我认为waitpid()wait() 一样工作,编译器没有给我任何错误或警告。
    • @user1322538:如果你不愿意做很多的腿活,C语言是一种糟糕的语言。
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2018-09-20
    • 2014-07-09
    • 2014-02-28
    • 2015-01-18
    相关资源
    最近更新 更多