所以在我的程序中,用户给出了三个参数。然后,我把它管成三个孩子。
两个孩子都做自己的计算,然后退出。最后一个孩子显示结果。
父母等待所有孩子完成,然后它只是终止程序。
孩子们做什么的总结:
inputs are a, b, c.
child0: c0 = a*b
child1: c1 = b*c
overview: printf("%d %d", c0, c1);
我无法弄清楚如何正确打印概述。它不断打印出奇怪的损坏字符或盒子。
任何人对如何正确地做任何事都有任何建议?我读了一本书,但它只详细介绍了单个子母管。这涉及多个孩子,我想这就是我困惑的地方。谢谢你的帮助!
以下代码:
int main(int argc, char *argv[]) {
int fd[4];
int a, b, c, c0, c1, status;
char char0[10];
char char1[10];
pid_t child0;
pid_t child1;
pid_t overview;
// Set argv to ints
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
// Pipe
pipe(fd);
// child0
if((child0 = fork()) == 0) {
close(fd[2]);
c0 = a*b;
sprintf(char0, "%d", c0);
write(fd[0], char0, 10);
close(fd[0]);
exit(0);
}
// child1
if((child1 = fork()) == 0) {
close(fd[2]);
c1 = b*c;
sprintf(char1, "%d", c1);
write(fd[1], char1, 10);
close(fd[1]);
exit(0);
}
// overview
if((overview = fork()) == 0) {
close(fd[0]);
close(fd[1]);
read(fd[2], char0, 10);
read(fd[2], char1, 10);
printf("%s %s", char0, char1); //Prints weird stuff??
close(fd[2]);
exit(0);
}
// Wait for children to finish
waitpid(child0, &status, 0);
waitpid(child1, &status, 0);
waitpid(overview, &status, 0);
exit(0);
}
答案 0 :(得分:1)
您声明管道的代码完全错误,管道只有两个端点,并且要声明三个管道,您需要声明如下
pd1[2];
pd2[2];
pd3[2];
从一端你可以写出pd1[1];
从另一端您可以阅读pd1[0];
所以你的代码看起来像,
int main(int argc, char *argv[]) {
int fd1[2];
int fd2[2];
int fd1[2];
int a, b, c, c0, c1, status;
char char0[10];
char char1[10];
pid_t child0;
pid_t child1;
pid_t overview;
// Set argv to ints
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
// Pipe
pipe(fd1);
pipe(fd2);
pipe(fd3);
// child0
if((child0 = fork()) == 0) {
close(fd1[0]);
c0 = a*b;
sprintf(char0, "%d", c0);
write(fd1[1], char0, 10);
close(fd[1]);
exit(0);
}
// child1
if((child1 = fork()) == 0) {
close(fd2[0]);
c1 = b*c;
sprintf(char1, "%d", c1);
write(fd2[1], char1, 10);
close(fd2[1]);
exit(0);
}
// overview
if((overview = fork()) == 0) {
close(fd1[1]);
close(fd2[1]);
read(fd1[0], char0, 10);
read(fd2[0], char1, 10);
printf("%s %s", char0, char1); //Prints weird stuff??
//close(fd[2]);
exit(0);
}
// Wait for children to finish
waitpid(child0, &status, 0);
waitpid(child1, &status, 0);
waitpid(overview, &status, 0);
exit(0);
}
这段代码可能也不正确我刚刚解释了如何使用管道,看到管道的打开和关闭,也就是说,应该关闭写入读取结束,同时应该关闭阅读结束。
修改强>
看到这篇文章并执行小程序,然后逐步修改你的代码,你将会理解。
How to send a simple string between two programs using pipes?