gpt4 book ai didi

c - 在 Linux 上使用 C 中的 2 个管道进行双向父子通信

转载 作者:太空狗 更新时间:2023-10-29 11:15:53 25 4
gpt4 key购买 nike

我正在尝试在 Linux 上使用 2 个使用 C 的管道在父进程和子进程之间创建双向通信。 parent 是我的程序, child 只是一个随机程序(比如“猫”)。

我尝试在父级中使用 read() 来读取子输出,但它给了我 errno 9,这是错误的文件描述符。

下面是我的代码

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

#define Read 0
#define Write 1
#define ParentRead read_pipe[1]
#define ParentWrite write_pipe[0]
#define ChildRead write_pipe[1]
#define ChildWrite read_pipe[0]

int main()
{
int data_processed;

/** Pipe for reading for subprocess */
int read_pipe[2];
/** Pipe for writing to subprocess */
int write_pipe[2];

char buffer[100];
memset(buffer, '\0', 100);

if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0)
{
pid_t pid = fork();
if (pid == (pid_t)-1)
{
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
else if (pid == (pid_t)0) //Child process
{
close(Read);
close(Write);
close(ParentRead);
close(ParentWrite);
dup(ChildRead);
dup(ChildWrite);
execlp("cat", (char*)NULL);
exit(EXIT_FAILURE);
}
else { //Parent process
close(ChildRead);
close(ChildWrite);

write(ParentWrite, "abc", 3);
int r = read(ParentRead, buffer, 99);
printf("%d %d", r, errno);
puts(buffer);
}
}

exit(EXIT_SUCCESS);
}

最佳答案

如果你想将标准输入和标准输出重定向到管道,你需要使用 dup2(2) 系统调用。

dup2 (ChildRead, 0);
dup2 (ChildWrite, 1);

附言我还发现管道中的读/写方向错误。这是正确的方法

#define ParentRead      read_pipe[0]
#define ParentWrite write_pipe[1]
#define ChildRead write_pipe[0]
#define ChildWrite read_pipe[1]

记住:pipe[0]是读的fd,pipe[1]是写的fd。

还有一个错误,在 execlp 中。不要忘记将发送给执行程序的第一个参数设置为程序名称

execlp("cat", "cat", (char*)NULL);

关于c - 在 Linux 上使用 C 中的 2 个管道进行双向父子通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9318125/

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