ここに問題があります
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
何をし(!pid)
ますか?
ここに問題があります
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
何をし(!pid)
ますか?
これは以下と同等です:
if (!pid != 0) /* ... */
その後:
if (pid == 0) /* ... */
C11 (n1570)、§ 6.5.3.3 単項算術演算子
論理否定演算子の結果は、
!
オペランドの値が 0 と等しくない場合は 0、オペランドの値が 0 と等しい場合は 1 です。結果の型はint
です。式!E
は と同等(0==E)
です。
if(!pid)
あなたが書いたとおりです:
if(pid == 0) {
/* do something */
}
その後:
if(pid)
は
if(pid != 0)
! 演算子は、論理条件を否定します。
C では、数値 0 は論理偽と見なされ、その他の数値は論理真と見なされます。! 演算子は論理条件を否定するため、pid が 0 の場合は true になり、pid が 0 でない場合は false になります。
「pidがないとき」と読むことができます。
否定という意味です。あなたの場合、子プロセスcondition 1
の親プロセスで実行されcondition 2
ます。
普通の古いCにはブールデータ型はありませんが、ブール論理があります。
数値はすべて、 と評価さtrue
れる 0 を除いて と評価されfalse
ます。
この結果は、条件が真かどうかをテストしたい場合、実際にはそれを 0 と比較しているという事実です。
C の比較演算子は、数値の 1 または 0 を返すことを意味するtrue
orの結果を生成します。false
否定演算子は に反転true
しfalse
ます。
!pid
pid
ゼロに等しい場合、式は真になります。
基本的には、次と同じです。
if (pid == 0) {
}
false の場合: false、0、null true の場合: その他すべて。
!pid が true である場合、pid は 0、false、または null である必要があります。
(!pid)
と同等です (pid == 0)
実際、質問のコードにはバグがあります。fork()
次の3つのうちの1つを返すことができます。
>0
子プロセスのプロセスID。これは親に返されます。
0
これは子供に返されます。
<0
失敗。これは親に返されます。
からの戻り値の適切な使用法については、このチュートリアルを確認してくださいfork
。
投稿されたすべての回答が正しいと思います。1 行では、(!pid) は (pid==0) と同等です。
ただし、ここでそれがどのように/なぜ使用されるかを説明する機会を利用します。
fork()
関数はサブプロセス AKA 子プロセスを作成します。したがって、関数が戻ると、そのインスタンスで 2 つのプロセスが存在し、コード的に同じ場所で実行されます。したがって、プロセスの 2 つのコピーで返されます。これを親と子と呼びます。
の戻り値はfork()
、親プロセスで返されたときの子のPIDです。& 子プロセスでは = 0 です。コードでは、pid = fork();
この戻り値をキャプチャします。
(pid==0) の場合、子プロセスにいます。(pid != 0) の場合、親プロセスにいます。親であるか子であるかに基づいて、コードの動作を変更できます。(たとえば、子で exec を呼び出し、親で待機することができます。)
fork 関数の詳細については、google for fork()
.