gpt4 book ai didi

c - 为什么 parent 不能读 child 的书

转载 作者:行者123 更新时间:2023-11-30 17:16:52 26 4
gpt4 key购买 nike

这里我遇到了有关管道的问题。

如果我向父级中的管道写入并从子级中的管道中读取,如下所示:

if(pid == 0){
char str1[100];
close(mypipe[1]);
read(mypipe[0], str1, 6);
close(mypipe[0]);
exit(0);
}
else{
while(wait(&state) != pid);
char str[] = "hello!";
close(mypipe[0]);
write(mypipe[1], str, strlen(str)+1);
close(mypipe[1]);
printf("pipe: %s\n", str);
}

然后我就可以得到打印“hello!”。

但是如果我像这样在子进程中写入并在父进程中读取:

if(pid == 0){
char str[] = "hello!";
close(mypipe[0]);
write(mypipe[1], str, strlen(str)+1);
close(mypipe[1]);
exit(0);
}
else{
while(wait(&state) != pid);
char str1[100];
close(mypipe[1]);
read(mypipe[0], str1, 6);
close(mypipe[0]);
printf("pipe: %s\n", str);
}

然后它什么也不打印。

我真的不知道为什么......

最佳答案

尽管您的第二个示例代码中存在错误(str 未在该范围内定义),并且尽管很明显 Hello! 已在您的第一个示例代码中打印,因为您刚刚定义了一个包含该内容的字符串并打印了它,所以您声称它不起作用的第二个代码实际上起作用了:

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

int main()
{
int mypipe[2];
int pid, state;

pipe(mypipe);
pid = fork();

// Child writes, parent reads and prints
if(pid == 0)
{
char str[] = "hello!";
close(mypipe[0]);
write(mypipe[1], str, strlen(str)+1);
close(mypipe[1]);
exit(0);
}
else
{
char str1[100];
while(wait(&state) != pid);
close(mypipe[1]);
read(mypipe[0], str1, 100); // you should read at least 7 bytes, not 6,
// in order to receive the trailing \0 byte.
close(mypipe[0]);
printf("pipe: %s\n", str1);
}
}

相反的方式是:

  // Parent writes, child reads and prints
if(pid != 0)
{
char str[] = "hello!";
close(mypipe[0]);
write(mypipe[1], str, strlen(str)+1);
while(wait(&state) != pid); // ensure child has read the pipe
close(mypipe[1]); // now we can close it
exit(0);
}
else
{
char str1[100];
close(mypipe[1]);
read(mypipe[0], str1, 100);
close(mypipe[0]);
printf("pipe: %s\n", str1);
}

关于c - 为什么 parent 不能读 child 的书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com