2014-10-20 63 views
1

我試圖啓動一個子進程並向他發送命令trought pipe。我想我錯過了一個我不知道的概念。進程通信:發送*命令,爲什麼循環

第一個命令發送成功,另一個失敗,它給了我一個無限循環。我不明白爲什麼。

parent.c

int invoke_proc(int out_tube[2]) { 

    pid_t pid; 
    int rv; 
    int tube[2]; 

    if(pipe (tube)) { 
     fprintf(stderr, "pipe"); 
     exit(1); 
    } 

    pid = fork(); 
    if (pid == -1) { 
     fprintf(stderr, "fork"); 
     exit(1); 
    } 

    // parent 
    if(pid) { 
     close(tube[0]); 
     out_tube[1] = tube[1]; 
    } 

    // child 
    else { 
     close(tube[1]); 
     dup2(tube[0], 0); 
     execl("child", "child", NULL); 
    } 

    return 0; 
} 

int main() { 
    int tube[2]; 
    //for (int i = 0; i < 2; i++) { 
     invoke_proc(tube); 

     sleep(2); 
     write(tube[1], "allo\n", 7); 
     printf("!\n"); 

     sleep(5); 
     write(tube[1], "bye bye\n", 10); 
     printf("!\n"); 

     sleep(5); 
     write(tube[1], "exit\n", 10); 
     printf("!\n"); 

     close(tube[1]); 

    //} 
    return 0; 
} 

child.c

int main() { 
    char string[100]; 

    printf("Child Process: [%d]\n", getpid()); 
    printf("-------------\n"); 

    do{ 
     printf("Enter Command: "); 

     fflush(stdout); 

     fgets(string, 100, stdin); 
     printf("[%s]\n",string);  

    } while(strcmp(string, "exit")); 
    return 0; 
} 

這裏是輸出:

-bash-4.1 $ ./parent 子進程:[61983]


輸入命令:[異體

]

輸入命令:!

[]

輸入命令:^ C

-bash-4.1 $

我結束的過程,否則會給我這後一個無限循環。

我在閱讀類似的問題,但我找不到答案。如果可能的話,請儘可能簡單地回答。

Thanx。

p.s and yes..this is a school work。我的目標是將相同的命令發送給多個孩子。但我試圖先走出這一步。

+1

哇,學校的工作......對不起,你有一個非常酷的學校。因爲我試圖在一個程序員專業的學院接受教育,他們甚至沒有在第一個課程中給C,我必須自己學習所有東西。你非常幸運☺ – 2014-10-20 19:40:54

回答