5

ここに問題があります

int main() {
    int pid = fork();
    if (!pid) {
        // condition 1
    } else {
        // condition 2
    }
    return 0;
}

何をし(!pid)ますか?

4

9 に答える 9

10

これは以下と同等です:

if (!pid != 0) /* ... */

その後:

if (pid == 0) /* ... */

C11 (n1570)、§ 6.5.3.3 単項算術演算子

論理否定演算子の結果は、!オペランドの値が 0 と等しくない場合は 0、オペランドの値が 0 と等しい場合は 1 です。結果の型はintです。式!Eは と同等(0==E)です。

于 2012-12-19T12:24:33.490 に答える
3
if(!pid)

あなたが書いたとおりです:

if(pid == 0) {
  /* do something */
}

その後:

if(pid) 

if(pid != 0)
于 2012-12-19T12:28:06.783 に答える
3

! 演算子は、論理条件を否定します。

C では、数値 0 は論理偽と見なされ、その他の数値は論理真と見なされます。! 演算子は論理条件を否定するため、pid が 0 の場合は true になり、pid が 0 でない場合は false になります。

「pidがないとき」と読むことができます。

于 2012-12-19T12:27:04.550 に答える
3

否定という意味です。あなたの場合、子プロセスcondition 1の親プロセスで実行されcondition 2ます。

于 2012-12-19T12:27:10.260 に答える
2

普通の古いCにはブールデータ型はありませんが、ブール論理があります。

数値はすべて、 と評価さtrueれる 0 を除いて と評価されfalseます。

この結果は、条件が真かどうかをテストしたい場合、実際にはそれを 0 と比較しているという事実です。

C の比較演算子は、数値の 1 または 0 を返すことを意味するtrueorの結果を生成します。false

否定演算子は に反転truefalseます。

于 2012-12-19T12:28:04.543 に答える
2

!pidpidゼロに等しい場合、式は真になります。

基本的には、次と同じです。

if (pid == 0) {
}
于 2012-12-19T12:26:45.330 に答える
1

false の場合: false、0、null tr​​ue の場合: その他すべて。

!pid が true である場合、pid は 0、false、または null である必要があります。

于 2012-12-19T12:26:38.370 に答える
0

(!pid)と同等です (pid == 0)

実際、質問のコードにはバグがあります。fork()次の3つのうちの1つを返すことができます。

>0 子プロセスのプロセスID。これは親に返されます。

0 これは子供に返されます。

<0 失敗。これは親に返されます。

からの戻り値の適切な使用法については、このチュートリアルを確認してくださいfork

于 2012-12-19T13:08:28.180 に答える
0

投稿されたすべての回答が正しいと思います。1 行では、(!pid) は (pid==0) と同等です。
ただし、ここでそれがどのように/なぜ使用されるかを説明する機会を利用します。

fork()関数はサブプロセス AKA 子プロセスを作成します。したがって、関数が戻ると、そのインスタンスで 2 つのプロセスが存在し、コード的に同じ場所で実行されます。したがって、プロセスの 2 つのコピーで返されます。これを親と子と呼びます。

の戻り値はfork()、親プロセスで返されたときの子のPIDです。& 子プロセスでは = 0 です。コードでは、pid = fork();この戻り値をキャプチャします。

(pid==0) の場合、子プロセスにいます。(pid != 0) の場合、親プロセスにいます。親であるか子であるかに基づいて、コードの動作を変更できます。(たとえば、子で exec を呼び出し、親で待機することができます。)

fork 関数の詳細については、google for fork().

于 2012-12-19T13:37:55.623 に答える