仔細閱讀fork(2)手冊頁。多次閱讀該頁面,這很難理解。請閱讀fork (system call)和processes (computing)上的Wikipage。
請理解 - 和這需要時間這fork
是返回同時在成功兩次:在孩子
的fork
系統調用可能會失敗一次是在家長和一次(然後返回-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.
如果你希望能夠到餐桌的多個進程,嘗試:
增加RLIMIT_NPROC
資源限制setrlimit(2)(可能會調用系統設施,所以也看看/etc/pam.d/login
等
降低fork
-計劃所需的資源。特別是降低堆內存要求
增加一些系統資源,如可能交換。你可以用一些臨時文件swapon
進行測試。
由於Joachim Pileborg replied你應該避免分叉太多(分叉過程繼續循環,從而也再次分叉)。
不要忘記stdio
例程被緩衝。適當地使用fflush(3)。
我建議你閱讀Advanced Linux Programming這本書(可以在線獲得),它有一個完整的章節解釋Linux上的進程處理。
BTW,請與ps
或top
或pstree
你有多少(並與free
命令多少內存使用,但抱怨之前閱讀http://linuxatemyram.com/)的過程。也可能發生這樣的情況,即你的特定系統不能跨越你的特定程序超過24倍(因爲缺乏資源)
也研究簡單shell的源代碼(如sash
)並使用strace -f
(例如在某些shell ,或者在你的程序中)來更多地瞭解系統調用的完成情況。還要學習如何使用gdb
調試器。
請在你的代碼(名稱,字符串,註釋)用英語 –
請不要發佈兩次同樣的問題... – Xymostech