fork(2) のマニュアルページから:
RETURN VALUE
On success, the PID of the child process is returned in the parent, and
0 is returned in the child. On failure, -1 is returned in the parent,
no child process is created, and errno is set appropriately.
フォークコールが失敗する原因が何であるかを知りたいです。フォークが-1を返す状況は何ですか?
私はCで標準のUnixシェルを書いています。このエラーをどのように処理する必要がありますか?
答え1
C APIでは、システムコールはエラーを示すために負の値を返し、エラーコードはerrno
エラーの性質に関する詳細情報を提供します。マニュアルページでは、システムで発生する可能性のあるエラーを説明する必要があります。そこに2つあります基準エラーコード:
EAGAIN
利用可能なリソースが不足しているため、新しいプロセスを作成できないことを示します(メモリの不足や制限の種類に達した(たとえば、ユーザーあたりまたはプロセス全体の最大数など))。ENOMEM
メモリ不足のために新しいプロセスを作成できないことを示します。 Linuxでは、ENOMEM
これはカーネルのメモリ不足を示し、ユーザーモードのメモリ不足はとして報告されますEAGAIN
。 OpenBSDでは、ENOMEM
ユーザースペースのメモリ不足の問題を解決するためにも使用されます。
要約すると、fork
利用可能なリソースが不足し(単純なメモリ不足ではなく人為的な制約の形で)失敗する可能性があります。
fork
POSIXは、失敗時のシェルの動作を指定しません。実際には異なるエラー状態を返す傾向があります(pdkshで1、ashから2、bashで254、ksh93から258、tcshで1、zshはエラー0を返します)。学習練習ではなく、本番用にシェルを実装する場合は、追加することをお勧めします。オースティングループメーリングリスト。
答え2
カーネルには、NPROC
同時に実行できるプロセスの最大数を示すパラメータがあることがわかります。すでに最大値に達して別のものを作成しようとすると、カーネルによって拒否され、親に-1が返されます。
一方、カーネルはユーザー固有のプロセス制限もパラメータに保存しますMAXUPRC
。上記と同じ特典が適用されます。
答え3
考えられる理由の1つは、クォータの制約や一部のシステム障害によって新しいプロセスを作成できないことです。
ソフトウェアを書くときに何かが失敗する理由は常にわかりませんが、すべての段階でエラーを処理するための明確に定義された方法を持つことは常に良い考えです。