在并行子进程之间分叉两次后,为什么pipe()不工作?

时间:2018-01-29 18:06:51

标签: c string unix pipe fork

我的目标是将一个字符串从一个子进程发送到另一个子进程。我在父进程中设置了一个管道,然后fork两次。两者都达到了声明打印,为什么管道消息没有?

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
int main (char * argv[], int argc)
{
int arr[2];
pipe(arr);

int id = 0;
int pid = fork();
id = 1;
if(pid > 0) pid = fork();

if(pid > 0)
{
    close(arr[0]);
    close(arr[1]);
    wait(NULL);
}
else if (id == 0)
{
    close(arr[0]);
    char message[] = "HYPERTEXT TRANSFER\n";
    write(arr[1],message,strlen(message)+1);
    printf("reached\n");
}
else if(id == 1)
{
    printf("reached\n");
    close(arr[1]);
    char * buf = malloc (sizeof(char)* 20);
    read(arr[0], buf, 20);
    printf("%s", buf);


}
return 0;
}

程序输出“到达”两次。

2 个答案:

答案 0 :(得分:1)

对于所有进程,

id为1。如果(id == 0)写任何东西,你不会进入else,因此,你试图从空管中读取。

答案 1 :(得分:0)

您的问题是,对于您的子进程id = 1。实际上,两个子进程都执行第id = 1行,因此它们都是接收者。

尝试:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
int main (char * argv[], int argc)
{
int arr[2];
pipe(arr);

int id = 0;
int pid = fork();

if(pid > 0) {
    pid = fork();
    id = 1; // Here only the second child process (and the parent process, but who cares) have id == 1.
}

if(pid > 0)
{
    close(arr[0]);
    close(arr[1]);
    wait(NULL);
}
else if (id == 0)
{
    close(arr[0]);
    char message[] = "HYPERTEXT TRANSFER\n";
    write(arr[1],message,strlen(message)+1);
    printf("reached\n");
}
else if(id == 1)
{
    printf("reached\n");
    close(arr[1]);
    char * buf = malloc (sizeof(char)* 20);
    read(arr[0], buf, 20);
    printf("%s", buf);


}
return 0;
}