それはどういう意味if(!fork())
ですか?私はそれについて少し混乱しています、私はいつ親と子のプロセスにいるのかわかりません:
if(!fork())
{
// is it child or parent process?
}else{
// is it child or parent process?
}
fork(2)
マンページから:
戻り値
成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。
子に0を返すためfork()
、if句はそれが子であるかどうかをテストします。
if (!fork()) // same as: if (fork() == 0)
{
// child
}else{
// parent
}
0
ブール値であるかのように条件付きで使用できるため、これは次の質問と同じです。
if(fork() == 0) {
ドキュメントには次のように書かれています。
成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。
0
コーダーが「not 」または0
(「true」または「false」)のみを気にする場合、条件付きで整数値を直接使用するのが一般的なイディオムです。
の呼び出しは子で0を返すため(もちろん、機能する場合)、ステートメントfork
の真の(最初の)部分がそこで実行されます(真であるため)。if
!0
fork
false(2番目)の部分は、成功する(子のPIDを返す)か失敗する(戻る)かにかかわらず、親で実行されます-1
。
すべてのエッジケースを考慮しているわけではないので、私はこの特定の方法の大ファンではありません。私は次のようなものが好きです:
pid_t pid = fork();
switch (pid) {
case -1: {
// I am the parent, there is no child, see errno for detail.
break;
}
case 0: {
// I am the child.
break;
}
default: {
// I am the parent, child PID is in pid, eg, for waitpid().
break;
}
}
この設定により、情報を失うことなく、何が起こっているのかを正確に把握できます。
if(!fork())
{
/* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
/* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}
そのコードはフォークからのエラーをチェックしません!すでに実行されているプロセスが多すぎる場合、または十分なメモリフォークがない場合、失敗し、ソフトウェアはおそらく非常に奇妙な方法で動作します。
してくださいman fork
、あなたはそれについてもっと知るでしょう。それは実際に戻っpid_t
てきますint
正常に返されると0
、子プロセスには正の値、親プロセスには正の値が与えられます
実際にはこのようなものです:
pid_t pid;
pid=fork();
if(pid <0)
{
printf("fork failed");
return -1;
}
else if(pid == 0)
{
it is child process
}
else
{
It is parent process
}
つまり、条件が真であり、内部のステートメントを実行する場合、それは間違いなくif(!fork())
意味します。child process
!0 == 1
if(!fork())
の値は次のfork()
とおりです。
0、これは子供であることを意味します
<0、これはエラーです
> 0親、つまり親です
if (!fork())
は短い書き方なのでif (fork() == 0)
、次のことを意味します。
if(!fork()) {
// it is a child process
}
else {
// it is a parent process
}