2015-09-29 149 views
1

在兩個過程之間建立管道的情況下,如果這兩個人有兄弟關係而不是父親關係,他們會更容易出錯嗎?兄弟兄弟比父親孩子更安全嗎?

我給這個問題出現了,當我調查下面的代碼例如:

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/wait.h> 

void runpipe(); 

int 
main(int argc, char **argv) 
{ 
    int pid, status; 
    int fd[2]; 

    pipe(fd); 

    switch (pid = fork()) 
    { 

    case 0: /* child */ 
     runpipe(fd); 
     exit(0); 

    default: /* parent */ 
     while ((pid = wait(&status)) != -1) { 
      fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status)); 
      exit(0); 
     } 

    case -1: 
     perror("fork"); 
     exit(1); 
    } 
    exit(0); 
} 

char *cmd1[] = { "ls", "-al", "/", 0 }; 
char *cmd2[] = { "tr", "a-z", "A-Z", 0 }; 

void 
runpipe(int pfd[]) 
{ 
    int pid; 

    switch (pid = fork()) 
    { 

    case 0: /* child */ 
     dup2(pfd[0], 0); 
     close(pfd[1]); /* the child does not need this end of the pipe */ 
     execvp(cmd2[0], cmd2); 
     perror(cmd2[0]); 

    default: /* parent */ 
     dup2(pfd[1], 1); 
     close(pfd[0]); /* the parent does not need this end of the pipe */ 
     execvp(cmd1[0], cmd1); 
     perror(cmd1[0]); 


    case -1: 
     perror("fork"); 
     exit(1); 
    } 
} 

在上面的例子中,親本(爺爺)叉子(父),其然後派生另一個子(孫)。爺爺等爸爸,但爸爸不等孫子,因爲他們都執行execvp。如果孩子早於父親(殭屍)或父親早於孩子(孤兒)結束,會發生什麼?另一方面,如果我們有兩個兄弟連接管道和一個父親並等待他們(總共三個進程),即使他們兩個兄弟都執行execvp,退出也不會損害另一個兄弟。

回答

2

在兩個進程之間建立管道的情況下,如果這兩個兄弟有兄弟關係而不是父親孩子,他們會更容易出錯嗎?

就管道而言,一切都取決於每個執行的I/O操作。如果讀取端的進程試圖讀取另一端的進程不準備寫入的數據,則它將阻塞,直到寫入者寫入或退出。在後一種情況下,讀取將報告錯誤或返回短數據。

如果孩子早於父親(殭屍)或父親早於孩子(孤兒)結束,會發生什麼?

如果父親叫派生一個子後exec()功能,並通過wait()waitpid()收集它,如示例代碼之前,那麼就永遠不可能等待孩子。

無論如何,孩子和父親在終止時都成爲殭屍。對於孩子來說,不管它是否先成爲孤兒,情況都是如此。如果父親從未收集孩子(因爲它不會在你的例子中),那麼一旦父親終止,孩子(無論是活的還是殭屍)都被進程0(init)繼承,可以依靠它來清理其所有的殭屍孩子。同樣,如果爺爺從不收集父親,那麼init最終會做。

在某些情況下,殭屍可能建立未收集。這是資源泄漏的一種形式,但當殭屍被init繼承時,它最終會被清除。這是由您設置的祖父 - >父 - >子拓撲略微加劇的,但我不會將其描述爲「容易出錯」。

1

如果孩子早於父親(殭屍)結束,會發生什麼......

這將是一個殭屍進程。一旦父母完成沒有wait的孩子,該孩子將被重新授予initinit然後wait對孩子,檢索其退出代碼,並允許它最終退出。

......或爸爸比孩子(孤兒)早完成?

孤兒過程被重新授予init。該過程將如上所述。

+0

因此,父親孩子可以導致這些情況,而兄弟之間的兄弟管不能因爲父親會等待他的兩個孩子(兄弟),因此第二個更安全 – pgmank