2017-09-15 31 views
0

我想了解如何將一個進程的輸出發送到子進程。我已經下了一個學習文件描述符和管道的旅程。我想我幾乎在那裏,但是缺少一個關鍵部分。將stdout餵給將execv()排序的子進程

這是我到目前爲止有:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <string.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    int fd[2]; 
    pid_t sort_pid; 


    /* Create the pipe */ 
    if(pipe(fd) == -1) { 
     fprintf(stderr, "Pipe failed\n"); 
     exit(EXIT_FAILURE); 
    } 
    /* create child process that will sort */ 
    sort_pid = fork(); 
    if(sort_pid < 0) { // failed to fork 
     fprintf(stderr, "Child Fork failed\n"); 
     exit(EXIT_FAILURE); 
    } 
    else if(sort_pid == 0) { // child process 
     close(0); // close stdin 
     dup2(fd[0], 0); // make stdin same as fd[0] 
     close(fd[1]); // don't need this end of the pipe 
     execlp("D:/Cygwin/bin/sort", "sort", NULL); 
    } 
    else { // parent process 
     close(1); // close stdout 
     dup2(fd[1], 1); // make stdout same as fd[1] 
     close(fd[0]); // don't need this end of the pipe 
     printf("Hello\n"); 
     printf("Bye\n"); 
     printf("Hi\n"); 
     printf("G'day\n"); 
     printf("It Works!\n"); 
     wait(NULL); 
    } 

    return EXIT_SUCCESS; 
} 

這是不行的,因爲它似乎進入一個無限循環或某事。我嘗試了wait()的組合,但這也沒有幫助。

我這樣做是爲了學習如何將這個想法應用到我的實際程序中。在我的實際程序中,我讀取文件,逐行解析它們並將處理後的數據保存到靜態結構數組中。我希望能夠根據這些結果生成輸出,並使用fork()和execv()系統調用對輸出進行排序。

這最終是一個uni項目。

這些都是我解剖去我在迄今爲止階段類似的例子:

而且我閱讀手冊頁上相關的系統調用來嘗試和理解它們。我會承認我對管道的知識並使用它們基本上沒有什麼,因爲這是我第一次嘗試使用它們。

任何幫助表示讚賞,甚至更多的信息來源,我可以看看自己。我似乎已經用盡了谷歌搜索給我的大部分有用的東西。

+0

噢,我在execlp中使用絕對路徑來查看是否是這個問題,我也嘗試過使用相對路徑。 –

+0

我想從第二個鏈接寫入,不是printf – nimday

回答

1

sort將讀取,直到它遇到文件結束。因此,如果需要完成,您必須關閉管道的寫入端。因爲dup2的,你有open file description的兩個副本,所以你需要

  1. close(fd[1]);調用dup2
  2. close(1);後,可隨時在您完成寫入(新)stdout

確保在第二個之前確保fflush(stdout)確保您的所有數據實際上已將其放入管道中。

(這是一個簡單的死鎖例子:sort正在等待管道關閉,當父母退出時會發生這種情況,但父母不會退出,直到它完成等待孩子退出&hellip;)

+0

嗨,謝謝你的工作! 我知道這一定很簡單。感覺就像我差不多在那裏。感謝您的解釋。這很有道理。 –

相關問題