gpt4 book ai didi

c - 进程之间的正确管道

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:11 25 4
gpt4 key购买 nike

问题:父对象将从键盘读取一个整数并使用管道将一个值发送给它的一个子对象。 child 将采用该值并平方并将其传递给下一个 child 。另一个 child 会将收到的值加一。然后这个 child 会将值传递回父级,父级将打印到屏幕上。这将重复,直到 EOF 作为输入给出。

坦率地说,这是一个实验室练习,我以为我已经完成了,但我不清楚某些逻辑。对于我的代码,预期的输出将在第一次工作,但只是第一次。第一次运行后给出的任何输入都将导致无响应或不当行为(例如将值传递给 child 但什么也没有发生)。

      #include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
void square_plus1()
{
int fd[2];
int fd2[2];
int fd3[3];
int value;
int myInt;
int status;
pid_t child1;
pid_t child2;

pipe(fd);
pipe(fd2);
pipe(fd3);
child1 = fork();
child2 = fork();

if(child1 == 0)
{
close(fd3[0]);
close(fd3[1]);

close(fd[1]);
close(fd2[0]);

read(fd[0],&value,sizeof(value));
close(fd[0]);
printf("Child1(%d) received value: %d\n", getpid(), value);
value = value * value;
write(fd2[1],&value,sizeof(value));
close(fd2[1]);
exit(0);
}
else if(child2 == 0)
{
close(fd[0]);
close(fd[1]);

close(fd2[1]);
close(fd3[0]);

read(fd2[0],&value,sizeof(value));
printf("Child2(%d) received value: %d\n", getpid(), value);
close(fd2[0]);
value++;
write(fd3[1],&value,sizeof(value));
close(fd3[1]);
exit(0);
}
else
{
while((scanf("%d", &value)) != EOF)
{
write(fd[1],&value, sizeof(value));
printf("Parent(%d) sent value: %d\n", getpid(), value);
waitpid(child1,&status,0);
if(status == 0)
{
}
waitpid(child2,&status,0);
if(status == 0)
{
}
read(fd3[0],&value,sizeof(value));
printf("New Value: %d\n",value);
}

waitpid(child1,&status,0);
if(status == 0)
{
printf("Child 1 finishes normally\n");
}
waitpid(child2,&status,0);
if(status == 0)
{
printf("Child 2 finishes normally\n");
}
close(fd2[0]);
close(fd2[1]);
close(fd[0]);
close(fd[1]);
close(fd3[1]);
close(fd3[0]);
}
}
int main(void)
{
square_plus1();
return 0;
}

我有点了解管道,但还不足以解决问题。非常感谢任何帮助/引用。

最佳答案

首先,由于两次连续的 fork() 调用,这里混合了四个进程。这就是你拥有的

 child1 = fork();
child2 = fork();

在第一个 fork 之后,您有两个进程,即父进程和子进程。现在,当您执行第二个 fork 时,父进程和子进程将各自添加一个子进程。所以此时您有四个事件进程。您可能希望将第二个 fork 移动到父进程(如果 child == 0))或子进程(如果(child != 0))。需要解决的另一件事是在处理完第一个输入后,您的子进程正在退出,因此下一个处理在任何情况下都不会发生。接下来,您的管道需要适当设置以使其移动。

假设 fd1、fd2 和 fd3 是一对,这里是你应该做什么的粗略草图(不是完整的代码,只是为了传达图片)

    child1 = fork();
if(child1 == 0) {
// 1st child
// .. code to close fds accordingly
while (1) {
read(fd1[0],&value,sizeof(value));
printf("Child1(%d) received value: %d\n", getpid(), value);
value = value * value;
write(fd2[1],&value,sizeof(value));
}
exit(0);
} else {
child2 = fork();
if(child2 == 0) {
// 2nd child process
// .. code to close fds accordingly
while (1) {
read(fd2[0],&value,sizeof(value));
printf("Child2(%d) received value: %d\n", getpid(), value);
value++;
write(fd3[1],&value,sizeof(value));
}
exit(0);
}
// Parent process
// .. code to close fds accordingly
while((scanf("%d", &value)) != EOF)
{
write(fd1[1],&value, sizeof(value));
printf("Parent(%d) sent value: %d\n", getpid(), value);
read(fd3[0],&value,sizeof(value));
printf("New Value: %d\n",value);
}

}

关于c - 进程之间的正确管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569438/

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