gpt4 book ai didi

c - 使用 Write() 写入管道总是返回 0

转载 作者:行者123 更新时间:2023-11-30 16:49:38 25 4
gpt4 key购买 nike

我试图让两个进程通过以下方式相互写入: 1. 父进程写信给子进程 2. 子进程接收来自父进程的消息 3. child 写信给 parent 4.父进程接收子进程的消息

我不明白为什么当我尝试发送字母“A”时,写入函数总是返回零。有谁知道为什么?我查看了手册页,它只是说它返回 0 字节,但“A”是一个应该是一个字节的字符?

int main()
{
int fdP[2]; //used for child to contact parent
int fdC[2]; //used by parent to contact child
int nBytes;
char readBuffer[2];
char writeBuffer[2];

pipe(fdP); //Child >> Parent
pipe(fdC); //Parent >> Child

pid_t pid;
pid = fork();
if( pid < 0)
{
perror("There was an error during the fork");
exit(1);
}

//two processes running here
if (pid == 0) //child process
{
close(fdP[0]);
close(fdC[1]);
while (nBytes != 0) //when nbytes is nonzero it received a message
{
nBytes = read(fdP[0], readBuffer, sizeof(readBuffer));
}
printf("Child received: %s\n", readBuffer);

write(fdP[1], "B", sizeof(readBuffer));
exit(0);
}
else //parent process
{
close(fdC[1]);
close(fdP[0]);

while(write(fdC[1], "A", sizeof("A")) != 0) //THIS ALWAYS RETURNS ZERO
{
printf("%s\n", "I'M STUCK HERE");
}

while (nBytes != 0) //when nbytes is nonzero it received a message
{
nBytes = read(fdC[0], readBuffer, sizeof(readBuffer));
}
printf("Parent received: %s\n", readBuffer);
wait(NULL);
}
printf("%s\n", "finished");
}

最佳答案

我发现一些问题:

  • 在初始化之前使用 nBytes。这是未定义的行为。
  • sizeof("A") 是错误的。这给出了 const char* 的大小,而不是字符串的实际大小。
  • 用 0 测试 read() 和 write() 的逻辑是向后的。 (实际上,对于这个玩具程序,您可以完全删除循环和 nBytes 变量,而只需执行每个 read() 和 write() 一次。)

此外,您还混淆了文件描述符。假设您对它们的评论是正确的,详细信息如下:

  • 子进程应该从 fdC[0] 读取,而不是 fdP[0]。
  • 父进程关闭与预期相反的文件描述符。
  • 父进程应该从 fdP[0] 读取,而不是 fdC[0]。

当我修复上述所有问题后,您的代码似乎可以执行您想要的操作。这是我最终得到的结果:

int main()
{
int fdP[2]; //used for child to contact parent
int fdC[2]; //used by parent to contact child
char readBuffer[2];

pipe(fdP); //Child >> Parent
pipe(fdC); //Parent >> Child

pid_t pid;
pid = fork();
if( pid < 0)
{
perror("There was an error during the fork");
exit(1);
}

//two processes running here
if (pid == 0) //child process
{
close(fdP[0]);
close(fdC[1]);
read(fdC[0], readBuffer, sizeof(readBuffer));
printf("Child received: %s\n", readBuffer);
write(fdP[1], "B", 2);
exit(0);
}
else //parent process
{
close(fdC[0]);
close(fdP[1]);
write(fdC[1], "A", 2);
read(fdP[0], readBuffer, sizeof(readBuffer));
printf("Parent received: %s\n", readBuffer);
wait(NULL);
}
printf("%s\n", "finished");
}

关于c - 使用 Write() 写入管道总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42500516/

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