次のfork()呼び出しの出力はどうなりますか?
func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}
私はOSを初めて使用するので、誰かがこのコードの答えといくつかの説明を得るのを手伝ってくれますか?SOのfork()についていくつか質問を見つけましたが、あまり理解できませんでした。
次のfork()呼び出しの出力はどうなりますか?
func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}
私はOSを初めて使用するので、誰かがこのコードの答えといくつかの説明を得るのを手伝ってくれますか?SOのfork()についていくつか質問を見つけましたが、あまり理解できませんでした。
Saikacollectionは40
、コードへの出力として印刷されます。これは次のように説明できます:-
出力を理解するには、次のことを知る必要があります:-
parent process.
pid
、子の(プロセス識別子)を親に返します0
子プロセスに戻ります。示されている画像を検討してください:-
規則:プロセスのすべての親(呼び出し元)は、に書き込まれ、。left
でマークされstar
ます。
fork()
最初はプロセスが1つしかないため、fork()呼び出しで子が作成されます。ツリーのルートをレベル1と見なすと、レベル2で確認できます。親(左)と子(右)の2つのプロセスがあります。
fork()
fork()は、1、2、3、4とマークされたそのようなプロセスをさらに作成します。4つのプロセスすべてがさらに同様のコード構造を通過するため、プロセスの総数は、単一のプロセスが生成する回数4
になると言えます。4
fork()&&fork()||fork()
このステートメントを理解するには、Cで、&& operator has more precedence than ||
first
によって結合された2つのオペランドのgosの&&
場合wrong
、don't check the second
。同様に、first
の2つのオペランドのいずれか||
がtrue
、we don't check the second
オペランドの場合。&&fork()
4番目のレベルでの親の実行は、1つのプロセスのpidを返します。このプロセスは終了し、そのステップの子は0を取得します。したがって、次の実行に進みます。||fork()
||fork()
呼び出しは、結果としてさらにプロセスを生成します3つのノードすべてに対して同じことを行っていれば、5*4 = 20
プロセスを取得できたはずです。
fork()
Final fork()doubles
は、そのステップで使用可能なプロセスの数だけです。
2*20 = 40
。Saikacollectionは毎回新しい行に32回印刷されます。
新しいプロセスをより独立させたい場合は、exec- *ファミリーのfuncitons(POSIX)を見て、フォークしてすぐにフォークプロセスを置き換えることができます(新しくフォークされたプロセスは制御されているため、これを行うことができます)あなたによって); または、popen()も見てください。