Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux编程-管道使子进程退出_C_Unix_Pipe - Fatal编程技术网

C Linux编程-管道使子进程退出

C Linux编程-管道使子进程退出,c,unix,pipe,C,Unix,Pipe,我很难理解以下代码的行为。关闭文件描述符p[0]将使程序退出(因为否则父进程将永远等待子进程)。这对我来说没有意义,因为子进程正在运行一个无限while循环,为什么它们会因为管道的读取端关闭而退出呢?当然,您将无法写入管道,但while循环并不取决于父进程的读取端是否打开。我试图删除子进程中的exit()函数,但程序无论如何都会退出,那么为什么子进程一注意到读取端已关闭,就会自杀呢 #include <stdio.h> #include <stdlib.h> #inclu

我很难理解以下代码的行为。关闭文件描述符p[0]将使程序退出(因为否则父进程将永远等待子进程)。这对我来说没有意义,因为子进程正在运行一个无限while循环,为什么它们会因为管道的读取端关闭而退出呢?当然,您将无法写入管道,但while循环并不取决于父进程的读取端是否打开。我试图删除子进程中的exit()函数,但程序无论如何都会退出,那么为什么子进程一注意到读取端已关闭,就会自杀呢

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

main()
{
    int run=10, fd[2]; pipe(fd); srand(time(0)); char ch, x='x', o='o'; 

    if(!fork())
    {
        close(fd[0]);

        while(run)
        {
            sleep(1+rand()%6); write(fd[1],&x,1);
        }

        exit(0); //This exit doesn't happen
    }

    if(!fork())
    {
        close(fd[0]);

        while(run)
        {
            sleep(1+rand()%3); write(fd[1],&o,1);
        }

        exit(0); //This exit doesn't happen
    }

    close(fd[1]);
    while(run--)
    {
        read(fd[0],&ch,1);
        printf("%d %c\n",run,ch);
        sleep(1);
    }

    close(fd[0]); //closing this file descriptor results in that the program can exit
    wait(0);
    wait(0);
    exit(0);

}
#包括
#包括
#包括
main()
{
int run=10,fd[2];管道(fd);srand(时间(0));字符ch,x='x',o='o';
如果(!fork())
{
关闭(fd[0]);
while(运行)
{
睡眠(1+rand()%6);写入(fd[1],&x,1);
}
退出(0);//此退出不会发生
}
如果(!fork())
{
关闭(fd[0]);
while(运行)
{
睡眠(1+rand()%3);写入(fd[1],&o,1);
}
退出(0);//此退出不会发生
}
关闭(fd[1]);
而(运行--)
{
读取(fd[0],&ch,1);
printf(“%d%c\n”,run,ch);
睡眠(1);
}
close(fd[0]);//关闭此文件描述符将导致程序可以退出
等待(0);
等待(0);
出口(0);
}

这是标准行为。您关闭管道的读取端,因此无处写入。这将导致向写入进程发送
SIGPIPE
信号

SIGPIPE
的默认行为是终止接收信号的进程


如果你想让你的进程在信号中生存下来,你必须抓住或忽略它。然后必须检查写入的结果,因为当管道读取端关闭时,它将返回错误。

这是标准行为。您关闭管道的读取端,因此无处写入。这将导致向写入进程发送
SIGPIPE
信号

SIGPIPE
的默认行为是终止接收信号的进程


如果你想让你的进程在信号中生存下来,你必须抓住或忽略它。然后,您必须检查写入的结果,因为当管道读取端关闭时,它将返回错误。

您的问题不在于管道。代码中缺少两个头文件,在调用wait()函数时,该头文件将崩溃。在您的程序中添加以下两个头文件,它将解决您的问题。另外,您对
main
函数的声明是旧的c类型声明,使其类似于
void main()


您的问题不在于管道。代码中缺少两个头文件,在调用wait()函数时,该头文件将崩溃。在您的程序中添加以下两个头文件,它将解决您的问题。另外,您对
main
函数的声明是旧的c类型声明,使其类似于
void main()



哦,好的。这是有道理的。我必须承认,我有点跳过了我课本上的信号部分。非常感谢您的回答:-)哦,好的。这是有道理的。我必须承认,我有点跳过了我课本上的信号部分。非常感谢您的回答:-)您确定您的应用程序在不添加我的回答中提到的头文件的情况下工作吗?()您确定您的应用程序在不添加我回答中提到的头文件的情况下工作吗?( )
<sys/types.h>
<sys/wait.h>