gpt4 book ai didi

c - 使用管道向后发送信息的 C 语言编程

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

我正在尝试弄清楚如何使用管道。我已经设法设置管道将信息从 C1(子 1)发送到 C2(子 2),但是,当我尝试做相反的事情时,例如从 C2 向 C1 发送整数“10”,在我第一次调用 system("ps -o pid,ppid,pgid,sess,comm") 后,它被卡住了。一般来说,我似乎在向前发送内容时没有问题,但是当我尝试向后发送内容时似乎会出现问题。我在这里遗漏了一些逻辑步骤吗?

./in 读取一个整数并打印它,./out 获取一个整数并写入它。他们似乎工作得很好。

 #include  <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <assert.h>
#define READ 0
#define WRITE 1

int main()
{
int fds[2];
pid_t pid;
int test;

if(pipe(fds)<0)
{
exit(0);
}

pid = fork();

if(pid==0)
{//C1
test = close(READ); assert(test==0);
test = dup(fds[READ]); assert(test==READ);
test = close(fds[READ]); assert(test==0);
test = close(fds[WRITE]); assert(test==0);
sleep(1);
execlp("./in", "./in", NULL);
exit(1);
}
system("ps -o pid,ppid,pgid,sess,comm");
wait(0);
system("ps -o pid,ppid,pgid,sess,comm");
sleep(2);
pid = fork();

if(pid==0)
{//C2
test = close(WRITE); assert(test==0);
test = dup(fds[WRITE]); assert(test==WRITE);
test = close(READ); assert(test==0);
test = close(fds[READ]); assert(test==0);
test = close(fds[WRITE]); assert(test==0);
sleep(2);
execlp("./out", "./out", "10", NULL);
exit(0);
}
sleep(1);
test = close(fds[READ]); assert(test==0);
test = close(fds[WRITE]); assert(test==0);
system("ps -o pid,ppid,pgid,sess,comm");
wait(0);
system("ps -o pid,ppid,pgid,sess,comm");
return 0;
}

最佳答案

进程卡住的原因是调用 system() 后的 wait() 系统调用。 system() 实际上调用 wait() 本身,因此您的 wait() 正在等待子进程 1 完成,但子进程 1 本身可能被阻塞IO。

对于双向通信,您确实需要两个管道,一个用于每个方向的通信。对于第二个管道,您所做的几乎与目前所做的完全一样,除了子 1 替换了 stdout,而子 2 则替换了 stdin。

关于c - 使用管道向后发送信息的 C 语言编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42692791/

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