fork(2)のman ページをよく読んでください。そのページを何度も読んでください。理解するのは難しいです。フォーク (システム コール)とプロセス (コンピューティング)のウィキページもお読みください。
理解してください-そしてそれには時間がかかります-成功すると2回同時にfork
返されます:親で1回、子で1回
fork
syscall は、さまざまな理由で失敗する (そして -1 を返す) 場合があります。失敗した場合は、fork
を使用するperror
か、他の方法で表示してerrno
ください。そして、常に の結果を保持する必要がありfork
ます。だからコード
for (ii = 0; ii < 24; ++ii) {
fflush(NULL);
pid_t p = fork();
switch (p) {
case -1 : // fork failed
printf("\n\nproblem with fork() in pid %d error %s!!! \n\n",
(int) getpid(), strerror(errno));
exit(EXIT_FAILURE);
break;
case 0: // child process
WriteOnShared_Mem(ii);
ii = MAX_INT; // to stop the for loop
break;
default: // parent process
ChildPidTab[ii] = p;
/// etc.... some synchronization is needed
break;
}
特に、次のfork
理由で失敗する可能性があります。
EAGAIN fork() cannot allocate sufficient memory to copy the
parent's page tables and allocate a task structure for
the child.
EAGAIN It was not possible to create a new process because the
caller's RLIMIT_NPROC resource limit was encountered. To
exceed this limit, the process must have either the
CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.
ENOMEM fork() failed to allocate the necessary kernel structures
because memory is tight.
より多くのプロセスをフォークできるようにしたい場合は、次のことを試してください。
setrlimit(2)RLIMIT_NPROC
を使用してリソース制限を増やします (システム機能によって呼び出される可能性があるため、その他も調べます) 。/etc/pam.d/login
fork
-ing プログラムが必要とするリソースを減らします。特に、ヒープメモリ要件を下げます
おそらくスワップなど、いくつかのシステムリソースを増やします。swapon
テスト用の一時ファイルを作成できます。
Joachim Pileborg が答えたように、フォークしすぎないようにする必要があります (フォークされたプロセスはループを継続するため、再びフォークします)。
stdio
ルーチンがバッファリングされることを忘れないでください。fflush(3)を適切に使用してください。
Linux でのプロセス処理を説明する完全な章があるAdvanced Linux Programming book (オンラインで入手可能) を読むことをお勧めします。
ところで、あなたが持っているプロセスの数を確認してください(そして、コマンドでどれだけのメモリが使用されているかを確認してください。ただし、文句を言う前にhttp://linuxatemyram.com/を読んps
でください)特定のシステムが特定のプログラムを 24 回以上 fork できない場合があります (リソース不足のため)。top
pstree
free
sash
単純なシェル ( など)のソース コードも調べてstrace -f
(たとえば、シェルやプログラムで) 使用して、syscall が実行される内容をより理解してください。gdb
また、デバッガーの使用方法も学びます。