2012-03-06 29 views
2

我正在編寫一個程序,將最終用於有一個子進程通過管道發送隨機生成的字符到另一個子進程轉換爲大寫值和輸出,但在我得到遠,我試圖創建子進程並做出一些預期的輸出。我寫了下面的程序:創建新進程並期待輸出

#include <stdio.h> /* printf, stderr, fprintf */ 
#include <sys/types.h> /* pid_t */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    { 
     printf("Writer process created.\n"); 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     { 
      printf("Reader process created.\n"); 
      kill(reader); 
      printf("Reader was successfully murdered.\n"); 
     } 
     kill(writer); 
    } 
    wait(); 
    printf("Writer killed.\n"); 
    return 0; 
} 

我會非常喜歡的輸出出來,如下:

Writer process created. 
Reader process created. 
Reader was successfully murdered. 
Writer killed. 

但由於這一點,它輸出:

Writer process created. 
Reader process created. 
Reader was successfully murdered. 
Writer killed. 
Writer killed. 
Writer killed. 

就好像它正在經歷父進程的代碼的整個迭代,以及從它們被創建的點開始的兩個子進程,這也導致我相信它們沒有被殺死t我想要他們的適當時間。有人能指出我正確的方向嗎?

+0

我喜歡你的字符串。儘管最後一行可能更有創意:'printf(「在蘇聯俄羅斯,程序終止你。\ n」);返回0;'。 – 2012-03-06 23:03:02

+1

你確定你想要:if(reader == 0){kill(reader); ...}(kill(0);)? – ebutusov 2012-03-06 23:07:42

+0

@muntoo哈哈 - 我喜歡你的建議,我想我會使用xD – RedMageKnight 2012-03-06 23:09:36

回答

0

這是你的充滿工作示例與管道(也同步過程,所以你不必殺死他們)。記住,讀者進程正在讀取非常低效(由1個字符 - 我會離開它作爲一個練習了:))

#include <stdio.h> /* printf, stderr, fprintf */ 
#include <sys/types.h> /* pid_t */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 
#include <string.h> /* strlen */ 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 
    char buf; 
    int pipefd[2] = {-1,-1}; 
    const char* pcszTextToChild = "Text sent to child"; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    {/* writer process */ 
     printf("Writer process created.\n"); 
     if(pipe(pipefd) == -1) 
     { 
      perror("pipe"); 
      exit(EXIT_FAILURE); 
     } 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     {/* reader process */ 
      close(pipefd[1]); /* Close unused write end */ 
      printf("Reader process created.\n\tReading: "); 
      fflush(stdout); 
      while (read(pipefd[0], &buf, 1) > 0) 
       write(STDOUT_FILENO, &buf, 1); 
      write(STDOUT_FILENO, "\n", 1); 
      close(pipefd[0]); 
      printf("Exiting reader process.\n"); 
      exit(EXIT_SUCCESS); 
     } 
     else 
     {/* writer process */ 
      close(pipefd[0]);   /* Close unused read end */ 
      write(pipefd[1], pcszTextToChild, strlen(pcszTextToChild)); 
      close(pipefd[1]);   /* Reader will see EOF */ 
      wait(NULL);    /* Wait for child */ 
      printf("Exiting writer process.\n"); 
      exit(EXIT_SUCCESS); 
     } 
    } 
    wait(); 
    return 0; 
} 

結果:

Writer process created. 
Reader process created. 
    Reading: Text sent to child 
Exiting reader process. 
Exiting writer process. 
0

你不殺任何東西。有很多編譯器錯誤,你設法躲閃,所以 我添加了一些頭文件,並在kill()和wait()中留下錯誤。還要考慮捕捉返回碼並關注它們。有了正確的標題和/或錯誤陷阱,您就可以在早期看到您的問題。嘗試編譯,看看爲什麼事情沒有做你想做的。修復錯誤,事情會改善。

#include <sys/types.h> /* pid_t */ 
#include <sys/wait.h> 
#include <stdio.h> /* printf, stderr, fprintf */ 
#include <unistd.h> /* fork */ 
#include <stdlib.h> /* _exit */ 
#include <errno.h> /* errno */ 
#include <signal.h> 

int main() 
{ 
    pid_t writer; 
    pid_t reader; 

    writer = fork(); 
    if (writer == -1) 
    { 
     fprintf(stderr, "can't fork, error %d\n", errno); 
     exit(1); 
    } 

    if (writer == 0) 
    { 
     printf("Writer process created.\n"); 
     reader = fork(); 
     if (reader == -1) 
     { 
      fprintf(stderr, "can't fork, error %d\n", errno); 
      exit(1); 
     } 

     if (reader == 0) 
     { 
      printf("Reader process created.\n"); 
      kill(reader); 
      printf("Reader was successfully murdered.\n"); 
     } 
     kill(writer); 
    } 
    wait(); 
    printf("Writer killed.\n"); 
    return 0; 
} 
相關問題