2017-12-16 17 views
0
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() { 
    if (fork() == fork()){ 

     fprintf(stderr, "Z"); 
    } 
    else { 
     if (waitpid((pid_t)-1,NULL,0)!=-1) { 
      fprintf(stderr, "Y"); 

     } 
     else { 
      fprintf(stderr, "X"); 
     } 
    } 
} 

私はこのプログラムを勉強していて、 "ZYYX"が出力になることがわかりました。なぜ私はそれほど理解していない。私の理解では、親 - >親、親 - >子、子 - >親、子 - >親という4つのプロセスがあります。そして、child-> childがZを印刷することは間違いありません。そしてchild-> parentはZを印刷した後にYを印刷します。そしてparent-> parentはXを印刷するまで待つべきです。出力の最後の文字として出力されますか?"X"は出力の最後の文字になるのはなぜですか?

答えて

2

私はwaitpidが子プロセスを待っていることに気づいたので、ZYがプリントアウトされていれば、Yは "Y"を待っているのですぐにプリントアウトできます。したがって、Xは最後の文字として印刷できます。

+1

そしてZYYXは最後の位置にXを持つユニークなパターンです。 –

0

if (fork() == fork())がコードで使用されていたとは思いません - おめでとうございます!私はあなたの追跡によって完全には確信していません。私は、それが行った印刷に含まれる各プロセスのPIDを見たいと思っています。そして、各出力の最後に改行が必要です。また、元のコードで待たされていないプロセスが少なくとも1つあります。

ここでは、各印刷操作を実行するプロセスのPIDをレポートします。プロセスの中には、非ゼロステータスで終了するものがありますが、主に出力の面白さを高めるためです。このコードは、検出された死体を追跡し、その状態を報告します。また、死んだ子供たちをきれいにするためのループを導入しています。元のプロセスには、それ以外の場合はクリーンアップされていない子があります。

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

int main(void) 
{ 
    if (fork() == fork()) 
    { 
     fprintf(stderr, "Z(%d)\n", (int)getpid()); 
     return 23; 
    } 
    else 
    { 
     int corpse; 
     int status; 
     if ((corpse = waitpid((pid_t)-1, &status, 0)) != -1) 
      fprintf(stderr, "Y(%d) - PID %d 0x%.4X\n", (int)getpid(), corpse, status); 
     else 
     { 
      fprintf(stderr, "X(%d)\n", (int)getpid()); 
      return 37; 
     } 
     while ((corpse = waitpid((pid_t)-1, &status, 0)) != -1) 
      fprintf(stderr, "Q(%d) - PID %d 0x%.4X\n", (int)getpid(), corpse, status); 
    } 
    return 0; 
} 

出力例:

X(16551) 
Y(16547) - PID 16551 0x2500 
Z(16552) 
Y(16550) - PID 16552 0x1700 
Q(16547) - PID 16550 0x0000 
0

ご注意としては、二股に基づいて、4つの工程となり、それぞれが1つの文字出力します:

1st fork 2nd fork prints     PP 
parent parent  Y     /\ 
parent child   X     CP PC 
child  parent  Y     \ 
child  child   Z      CC 

のグラフを左に親子関係が表示されます。/が最初のフォーク、\が2番目のフォークです。

したがってCCでは、が両方のフォークが0を返し、PCがXを出力するため、Zが出力されます。他の2人は子供が出るのを待ってからYを印刷します。 CPのカスケードでは、Yは常にZの後になりますが、PPには2つの子がありますので、はZYの後またはXの後になる可能性があります。どちらも可能です。だからあなたはいずれかを得ることができます

XYZY PC,PP,CC,CP 
XZYY PC,CC,PP,CP or PC,CC,CP,PP 
ZXYY CC,PC,PP,CP or CC,PC,CP,PP 
ZYXY CC,CP,PC,PP 
ZYYX CC,CP,PP,PC 
関連する問題