2012-02-21 10 views
3
int main(){ 

    char ch; 

    fork(); 

    cin >> c; 
} 

fork()を呼び出した後、2つの正確なプロセスが同じコードを実行している必要があります。なぜこの単純な例を実行した後、私は文字を2回入力するか、2回入力するかのどちらかですか?このプログラムを実行するたびにシステムが2つの入力を期待してはいけませんか?fork()で何が起こりますか?

>./a.out 
a 
>./a.out 
a 
b 
> 
+2

これはCコードではなく、C++演算子を使用しているため、C++を使用していないユーザーの方はお手伝いできません。 – tbert

+0

2番目のプロセスが 'a'の直後に入力する' \ n'文字を取得する可能性があります。 'ch'の型を' std :: string'に変更して、何が起こるか見てみてください。 – dasblinkenlight

+0

私はちょうどやった、それは同じように動作します。 –

答えて

6

端末から同時に2つのプロセスを読み取っています。どのプロセスが入力を取得するかは誰でも推測しています。

  • 親プロセスが最初に入力を取得した場合は、終了してシェルに制御を返します。 (これは実際にシェルと子プロセスが入力のために戦っている同じ状況の繰り返しを引き起こすことに注意してください。)
  • 子プロセスが最初に入力を取得した場合、終了しますが、親プロセスまで制御はシェルに戻りません終了します。

同じ端末から2つのプロセスを読み取っている場合、一貫した動作は期待できません。

+0

最初のケースでは、2番目のプロセスは遅かれ早かれ入力の1行を取得することに注意してください。おそらくシェルプロンプトの後に。その場合、それはシェルからラインを盗むように見えます。 –

+0

@James私は疑いがあります。親プロセスが終了し、入力を受け取っていなくても子プロセスが終了します。 –

+1

@ Cookie503親プロセスが子プロセスのオープンfdを閉じることができません。問題は、このfdがどこを指しているかです。物理端子(実際のデバイス)を指す場合、デバイスは開いたままです。論理端末(ウィンドウ、リモートログインなど)を指している場合、論理デバイスは開いたままですが、将来のIOにどのように反応するかを指しています。セッショングループが変更されました。 –

2

fork()が呼び出されると、オペレーティングシステムは通常、実行中のプログラム(ソート)のメモリ空間全体をコピーします。両方のプログラムが実行されます。唯一の違いは、 "新しい"プロセスではfork()が0を返し、 "古い"プロセスでは新しいプロセスのプロセスIDを返します。

1つの入力のみを求められる理由は、プログラムの1つがバックグラウンドで実行されているためです。コマンドラインシェルは、一度に1つのプロセスに対してのみI/Oを実行します。

1

fork()は子プロセスを作成します。

しかし、どのプロセス(親と新生児の間で)がCPUスライスを取得するのかは不明です。両方のプロセスがキーボード入力に対してブロックされている場合、子プロセスまたは親プロセスが入力を取得できます。 親がトークンを取得した場合、そのアドレス空間で定義された変数に入力を読み込んで終了します。そして、子供は入力から読むことが決してありません。そして、この孤立した子プロセスは、「ルート」プロセス(pid = 1)によって採用されます。出力psを参照してください。

そして、子がトークンを取得してデータを読み込んで終了する場合、親はまだ生きているので、再び入力をブロックします。

+0

親が終了しても、子は同じ端末グループに属していなければなりません。 (私は確信していません。私はこのレベルで働いてからしばらくしています)。その場合、遅かれ早かれ、それは終了した親と競合しなくなりましたが、シェル。 –

0

fork()の後にwait()を入れて試してください。

関連する問題