[英]Linux pass value between parent process and child process using two pipes in c?
[英]Linux pass value between parent process and child process using pipe in c?
流程创建一个子流程,将x增加1,然后将x值发送给该子流程,然后该子流程可以将x乘以10,然后将x传递回父流程,依此类推。 您至少应该这样做5次。
输出应如下所示:
初始值0
上级:
运算后的x值:1
儿童:
手术后x值:10
上级:
运算后的x值:11
儿童:
手术后x值:110
上级:
手术后x值:111
儿童
手术后x值:1110
我所拥有的是以下......
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#define READ 0
#define WRITE 1
int main()
{
pid_t pid;
int mypipefd[2];
int ret;
int i;
int x=0;
int result,result2;
ret = pipe(mypipefd);
if(ret ==-1) //test for pipe
{
perror("pipe"); //show error and exit
exit(1);
}
printf("initial value %d\n", x);
pid = fork();
for(i=0;i<5;i++)
{
if(pid == 0)
{
/*Child process*/
result2=result*10;
write(mypipefd[WRITE],&result2,sizeof(result2));
printf("Child:\nx value after operation: %d\n", x);
close(mypipefd[WRITE]);
read(mypipefd[READ],&result2,sizeof(result2));
printf("=======================================\n");
close(mypipefd[READ]);
}
else if(pid > 0)
{
/*Parent process*/
result=x++;
write(mypipefd[READ],&result,sizeof(result));
printf("Parent:\nx value after operation: %d\n", x);
close(mypipefd[WRITE]);
read(mypipefd[WRITE],&result,sizeof(result));
printf("=======================================\n");
close(mypipefd[READ]);
exit(0);
}
else
{
perror("fork");
exit(1);
}
}
}
问题是,我的代码有什么问题? 我试图读取并写回管道,但似乎无法正常工作...
现在我的代码输出是什么:
初始值0
上级:
运算后的x值:1
儿童:
运算后的x值:0
儿童:
运算后的x值:0
儿童:
运算后的x值:0
儿童:
运算后的x值:0
儿童:
运算后的x值:0
我认为要解决的第一个问题是,当您尝试读取/写入数据时,管道的两端都打开了。 如果要将数据写入管道,则需要
close(fd[READ_END])
write(...)
close(fd[WRITE_END])
其次,unix中的管道是单工的。 您似乎正在尝试同时读取和写入管道。 如果要执行此操作,则必须打开两个管道。
我修改了程序,以向您展示如何从管道读取,然后为父/子管道写入管道。 希望这对您有帮助。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define BUFFER_SIZE 25
#define READ 0
#define WRITE 1
int main(void)
{
pid_t pid;
//open two pipes, one for each direction
int mypipefd[2];
int mypipefd2[2];
/* create the pipe */
if (pipe(mypipefd) == -1 || pipe(mypipefd2) == -1) {
fprintf(stderr,"Pipe failed");
return 1;
}
/* now fork a child process */
pid = fork();
if (pid < 0) {
fprintf(stderr, "Fork failed");
return 1;
}
if (pid > 0) { /* parent process */
int writeValue=10;
int readValue=0;
close(mypipefd[READ]); //close read end, write and then close write end
write(mypipefd[WRITE],&writeValue,sizeof(writeValue)); //write to pipe one
printf("Parent: writes value : %d\n", writeValue);
close(mypipefd[WRITE]);
close(mypipefd2[WRITE]); //close write end, read, and then close read end
read(mypipefd2[READ],&readValue,sizeof(readValue));
printf("Parent: reads value : %d\n", readValue);
close(mypipefd2[READ]);
}
else { /* child process */
int writeValue=20;
int readValue=0;
close(mypipefd[WRITE]); //close write end, read, and then close read end
read(mypipefd[READ],&readValue,sizeof(readValue));
printf("child: read value : %d\n", readValue);
writeValue+=readValue;
close(mypipefd[READ]);
close(mypipefd2[READ]); //close read end, write and then close write end
write(mypipefd2[WRITE],&writeValue,sizeof(writeValue));
printf("child: writeValue value : %d\n", writeValue);
close(mypipefd2[WRITE]);
}
return 0;
}
这打开两个管道。 父级将值写入第一个管道,而子级则读取该值。 子级更新此值,并将其写入第二方向管道。 然后,父级读取此值,然后感到烦恼! 双向管道通讯。
输出:
Parent: writes value : 10
child: read value : 10
child: write value : 30
Parent: reads value : 30
这样可以扩展到您的应用程序
if (pid > 0) { /* parent process */
result1++;
close(mypipefd[READ]); //close read end, write and then close write end
write(mypipefd[WRITE],&result1,sizeof(result1)); //write to pipe one
printf("Parent:\n x value after operation: %d\n", result1);
close(mypipefd[WRITE]);
close(mypipefd2[WRITE]); //close write end, read, and then close read end
read(mypipefd2[READ],&result1,sizeof(result1));
close(mypipefd2[READ]);
}
else { /* child process */
close(mypipefd[WRITE]); //close write end, read, and then close read end
read(mypipefd[READ],&result2,sizeof(result2));
result2*=10;
printf("child:\n x value after operation %d\n", result2);
close(mypipefd[READ]);
close(mypipefd2[READ]); //close read end, write and then close write end
write(mypipefd2[WRITE],&result2,sizeof(result2));
close(mypipefd2[WRITE]);
}
如果将其放入循环中,那么理论上就可以了。 但是,由于上下文切换和其他与OS相关的调度,执行顺序在两个进程之间会变得混乱。 这意味着读取和写入不一定按照您的方式进行,并且不会起作用。 读到这个问题, 如何等待数据写入到管道的另一端 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.