【问题标题】:When Using Pipes And Forks使用管子和叉子时
【发布时间】:2015-04-02 23:14:29
【问题描述】:

我有一个简单的程序(ma​​ximum1),可以打印文件中的最大数字。挑战在于使用分叉和管道来运行具有多个进程的多个文件,并从这些文件中打印出最高的数字。我关闭了第一个程序,以便打印数字,但是当我使用第二个程序(ma​​ximum2)时,我得到的数字比文件中的数字大。

我认为问题在于我对管道的使用或不理解对 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);
}

【问题讨论】:

    标签: c linux unix pipe system-calls


    【解决方案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);
    }
    

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

    【讨论】:

    • 谢谢!没有看到我已经切换了它们。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2017-07-07
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多