使用管道和叉子时

时间:2015-04-02 23:14:30

标签: c linux unix pipe system-calls

我有一个简单的程序( 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);
}

1 个答案:

答案 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);
}

并始终注意检查系统调用的返回值是多么重要。