gpt4 book ai didi

c - 父子之间的双向管道通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:17 25 4
gpt4 key购买 nike

我正在尝试使用 C 中的 2 个管道在父进程和子进程之间创建双向通信。在 child1 中运行的 prog1我想从 prog1 读取 3+4+5,然后用 write 向 prog1 发送一些东西,但我不能。哪里错了?

/* prog1.c */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void
main(void){
int FD;
unsigned int buf;
char buf[15];

printf("7+5+11=?\n");
FD=read(0,buf,10);
if(FD<0){
perror("FAIL\n");
exit(EXIT_FAILURE);
}
printf("TAKED:%s\n",buf);
}

程序2.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
void ERR_SYS(const char *msg);
int
main(void){
char buf[15];
int pipe1[2];
int pipe2[2];
pid_t childpid;

memset(buf,'\0',14);

if(pipe(pipe1) < 0 || pipe(pipe2) < 0)
ERR_SYS("fail_pipe");

if((childpid = fork()) < 0)
ERR_SYS("fail_fork");

if(childpid==0)
{
dup2(pipe2[1],1);
dup2(pipe1[0],0);
close(pipe1[1]);
close(pipe2[0]);
close(pipe2[1]);
close(pipe1[0]);
//close(1);
//close(0);
execle("./prog1",NULL,NULL,NULL);
}else{

close(pipe1[0]);
close(pipe2[1]);
read(pipe2[0],buf,4); /*I hope to read 3+4+5*/
printf("BuF::%s\n",buf);
write(pipe1[1],"off",3);/*send {off}*/
wait(NULL);
}
return 0;
}

void
ERR_SYS(const char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}

最佳答案

你的程序有几个问题:

  1. 您没有检查 prog2.c 中 read、write 和 execle 的返回值
  2. 您正在发送“7+5+11=?\n”字符串,该字符串长度为 10 个字符,但只需要 4 个字符(3+4+5 甚至不是四个字符)。
  3. 您发送的“off”也是 3 个字符长,但不包括空终止符。
  4. 当您从 fd 读取时,在这两种情况下您都不会得到以空字符结尾的字符串,然后您将尝试 printf 它。这是一种快速解决未定义行为的方法。在您从任何文件描述符读取的缓冲区末尾后放置一个“\0”!
  5. 尤其是 read 返回的内容非常重要,因为它告诉您读取了多少个字符。您永远不应该忽略 read 的返回值(在某些情况下它与 write 函数相同)。

下次也提供一些程序的输出,这样会更容易提供一些帮助。

关于c - 父子之间的双向管道通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22178382/

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