プログラム関数にこのコードがあります。そして、このコード パスにヒットするテスト スクリプトがあります。スクリプトは、この関数を複数回 (~1000) 通過します。
親ブロックの syslog から子 pid を確認できるため、fork() 呼び出しは成功しますが、子ブロックからは何も確認できません。
これは常に発生するわけではありません。100回の試行に1回しか発生しません。
これが発生する一般的な理由は何ですか。
また、障害に関する詳細情報を取得するには、何を探す必要がありますか。
int i;
if ((i = fork()) < 0) {
syslog(LOG_NOTICE, "(%s): fork failed!\n", __func__);
}
if (i) {
syslog(LOG_NOTICE, "(%s): fork Parent: id: %d\n", __func__, i);
} else {
syslog(LOG_NOTICE, "(%s): fork child\n", __func__);
/* Do something */
}
Output:
telnetd[24600]: (startslave): fork Parent: id: 24601
<Thats it, no log after this!!>
正確には、これは freeBSD telnetd startslave() コードの一部であり、スクリプトは telnet を使用してログインし、1000 回ログアウトしようとして失敗することがあります。失敗は保証されており、100 回の試行後または 700 回の試行後に発生する可能性があります。