2017-03-09 47 views
1

這個問題是this question的擴展,修改了要求。請參考以前版本的鏈接。從最後一個問題的主要區別在於:c編程 - 父母雙方和4個孩子之間雙向溝通沒有結果

  1. 需要通過io重定向

我有兩個管道的每個子進程,並有孩子家長的溝通每個孩子

  • 讀取文件的內容我是管道的新手,我遇到了問題。在更新版本:

    1. 家長分發卡和存儲結果在陣列
    2. 寫入陣列管負責寫結束對每個子進程
    3. 每個進程需要讀取從管道的負責讀端陣列
    4. 產生相同的輸出與以前版本

    問題是,當我運行的代碼,它沒有結果。我的代碼有什麼問題?

    我打算爲每個孩子在2d數組中存儲所有管道,即read_pipe[s][x],其中s是子進程標識符,x是文件描述符。

    我也研究過this question,但是,這個問題是針對1個家長的1個孩子,因爲我有4個孩子,所以無法解決我的問題。

    爲更新版本的初始嘗試:

    #include <stdio.h> 
    #include <string.h> 
    
    #define BUFFERSIZE 51 
    int main(void) 
    { 
        int ch; 
        ssize_t rread; 
        char *line = NULL; 
        size_t len = 0; 
        while (rread = getdelim(&line, &len, '\0', stdin) != -1) { 
         printf("Retrieved line of length %zu :\n", rread); 
         printf("%s", line); 
        } 
        char *array[BUFFERSIZE]; 
        int i=0; 
    
        array[i] = strtok(line," "); 
    
        while(array[i]!=NULL) 
        { 
         array[++i] = strtok(NULL," "); 
        } 
        //for (i=0; i<=BUFFERSIZE; i++) 
         // printf("\narray: %s: %d", array[i], i); 
        //return 0; 
    
        int childlimit = 4; 
        int childpids[childlimit]; 
        int currpid, s; 
        char *buf[BUFFERSIZE]; 
        /** Pipe for reading for subprocess */ 
        int read_pipe[4][2]; 
        /** Pipe for writing to subprocess */ 
        int write_pipe[4][2]; 
        int n; 
        char buffer[100]; 
        memset(buffer, '\0', 100); 
        if (pipe(read_pipe) == 0 && pipe(write_pipe) == 0) 
        { 
         for(s=0; s<childlimit; s++){ 
         switch(currpid = fork()){ 
         case 0: 
         printf("Child : %d, pid %d : ", s, getpid()); 
         close(read_pipe[s][1]); 
         close(write_pipe[s][0]); 
         close(write_pipe[s][1]); 
         while((n = read(read_pipe[s][0], buf, BUFFERSIZE))>0){ 
          printf("<child> %s", buf[n]); //no output 
         } 
         close(read_pipe[s][0]); 
         return 0; 
         case -1: 
           printf("Error when forking\n"); 
           break; 
         default: 
           // in the father 
           childpids[s] = currpid; 
           // store current child pid 
           close(read_pipe[s][0]); 
           close(read_pipe[s][1]); 
           close(write_pipe[s][1]); 
           int j,tt; 
           for(j=0; j<BUFFERSIZE; j+=4){ 
            buf[tt] = array[j]; 
            tt++; 
           } 
           write(write_pipe[s][0],buf,BUFFERSIZE); 
           close(write_pipe[s][0]); 
           break; 
         } 
        } 
        //wait for all child created to die 
        waitpid(-1, NULL, 0); 
        printf("Father : %d childs created\n", s); 
        } 
    } 
    
  • +2

    當你聲明int read_pipe [4] [2]時,你認爲'pipe(read_pipe)'會做什麼;'當期望接收'int fildes [2]'?恕我直言,只有第一個管道將被初始化。 –

    +0

    加上即使管道設置正確,代碼也不會將任何東西從父級傳遞到'read_pipe',而是將其放在'write_pipe'中,子級完全關閉。 –

    +0

    感謝您的意見。 @克里斯,請提供一個如何解決問題的答案。 –

    回答

    0

    作爲評價pipe()提到取尺寸爲2的int數組,其等同於一個管的兩端。您閱讀filedes [0]並寫入filedes [1]。下面是使用pipe()fork()一起使用的示例。

    int filedes[2]; 
    if(pipe(filedes)==0) 
        { 
        pid_t childpid=fork(); 
        if(childpid==0) 
        { 
        close(filedes[1]); // close write end of the pipe 
        read(filedes[0],buf,BUFFERSIZE); 
        close(filedes[0]); 
        exit(0); 
        } 
        else if(childpid!=-1) 
        { 
        close(filedes[0]); 
        write(filedes[1],buf,BUFFERSIZE); 
        close(filedes[1]); 
        wait(NULL); 
        } 
        else 
        { 
        printf("Fork failed\n"); 
        } 
        } 
    
    +0

    當我在問題中提到有多個孩子時,這個例子是否仍然正確?我如何修改它以適合多個孩子? –

    +0

    考慮到你的代碼一次只能處理一個孩子,是的,它應該適用於你正在做的事情 - 只需要根據你的需求充實讀寫代碼即可。 –

    相關問題