我的目标是将一个字符串从一个子进程发送到另一个子进程。我在父进程中设置了一个管道,然后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;
}
程序输出“到达”两次。
答案 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;
}