我有一个简单的程序( maximum1 ),可以打印文件中最高的数字。挑战在于使用分支和管道来运行具有多个进程的多个文件,并从这些文件中打印出最大的数字。我有第一个程序,所以它打印数字,但当我使用第二个程序( maximum2 )时,我的数字比文件中的数字大。
我认为问题在于我使用管道或不了解转移到num1。谢谢你的帮助!
if ((childpid1 = fork()) < 0) {
perror("Fork1 Error.\n");
} else if (childpid1 == 0) { //Child Code
close(fd[0]);
dup2(fd[1], 1);
dup2(fd[1], 2);
close(fd[1]);
execl ("max1", "max1", argv[1], NULL);
perror("Failed Exec.\n"); //Make sure Execl works
} else { //Parent Code
waitpid(childpid1, &status, 0);
char buffer[1024];
close(fd[0]);
read(fd[0], buffer, sizeof(buffer));
sscanf( buffer, "%d", &num1);
printf("%d\n", num1);
}
答案 0 :(得分:1)
在父进程的代码中,执行以下操作:
//Parent Code
waitpid(childpid1, &status, 0);
char buffer[1024];
close(fd[0]);
read(fd[0], buffer, sizeof(buffer));
sscanf(buffer, "%d", &num1);
printf("%d\n", num1);
所以你关闭fd[0]
,我想这是你的管道读取结束,然后你尝试从它read
。
该读取应该返回EBADF
错误,您永远不会检查。所以你可能只是在输出上打印垃圾。
将您的read(...)
更改为:
if (read(fd[0], buffer, sizeof(buffer) < 0) {
perror("read");
exit(EXIT_FAILURE);
}
并了解自己会发生什么。
您可能需要做的是关闭父进程的管道的写端。因此,请将close(fd[0])
更改为:
if (close(fd[1]) < 0) {
perror("close");
exit(EXIT_FAILURE);
}
并始终注意检查系统调用的返回值是多么重要。