2016-07-19 3 views
0

フォーク()の戻りはerrnoを行い、私はこのように書き、簡単なプログラムを持っている: -はなぜ= 22

int main(int argc, const char * argv[]) 
{ 
    printf ("Before Fork [%d][%d:%s]\n",getpid(),errno,strerror(errno)); 
    pid_t pid = fork(); 

    if (!pid) //CHILD PROCESS 
    { 
    printf ("In Child Process [%d [%d:%s]\n",getpid(),errno,strerror(errno)); 
    } 
    else 
    { 
    while(1); 
    } 
} 

これは、出力生成: -

Before Fork [50083][0:Undefined error: 0] 
In Child Process [50084][22:Invalid argument] 

OSがスローなぜ誰もが知っていますがFORKの直後に無効な引数エラーがありますか?

+4

[あなたの意見ではあなただけではありません](http://stackoverflow.com/questions/20295011/errno-set-in-child-process-after-fork-osx)その選択された答えはあなたにも当てはまります。 'fork()'が成功した場合、 'errno'に設定する特別な値はありません。それが失敗したときだけ、あなたは理由があることに頼ることができます。 – WhozCraig

+0

明日は33 – Michi

+0

になる可能性があります。疑問がある場合は、常に関連するマニュアルページをお読みください。この場合、[errno man page](http://linux.die.net/man/3/errno): "呼び出しの戻り値がエラー**を示した場合にのみ、その値は重要です**" – kaylum

答えて

-1

これは単なる推測ですが、フォークがシステムコールのクローン()(straceのを見ている)となりますので、それはことがあります

6952 write(1, "Before Fork [6952][0:Success]\n", 30) = 30 
6952 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f55f10e19d0) = 6953 
6953 write(1, "In Child Process [6953 [0:Succe"..., 36) = 36 

とクローン(2)manページは言う:

EINVALゼロ値が指定されたときにclone()によって返されます。 for child_stack。

私はカーネルのコードを歩いていないが、おそらく何かが旗のでアウトerroringずにいるためchild_stack=0のエラー番号を設定しますが、子の作成を終えています。

さらに、SIGCHLDがクローンフラグとして所属していないため、straceが不正になる可能性があります。

+0

いいえ、前の関数呼び出しが失敗していない限り(この場合はそうではなかった)、 'errno'を使うのは未定義の動作です。 – kaylum

+0

私はそれが仕様で定義されているとは言いませんでした。私はその原因を調べていた。何かがerrnoを変更し、唯一の容疑者は書き込みとクローンのようです。私はそれが書き込みではないと思う。 – evaitl

関連する問題