[英]C/C++ linux fork() and exec()
我正在使用fork()創建子進程。 從子進程中,我使用exec()啟動新進程。 我的代碼如下:
......
pid = fork();
if (pid > 0) {
WriteLog("Parent Process");
//Do something
} else if (pid == 0) {
WriteLog("Child process");
int return = execl(ShellScript);
if ( return == -1 )
WriteLog("Launch process fail");
} else {
WriteLog("Can't create child process");
}
......
注意:WriteLog函數將是打開文件,寫入日志和關閉文件。 (刷新)ShellScript將啟動新的進程c / c ++。
我長期運行我的程序,上面的代碼多次被調用。 有時(很少)會發生問題,盡管成功創建了子進程(我已經仔細檢查),但新進程無法成功啟動。 當此問題發生時,盡管成功創建了子進程,但仍然無法打印“子進程”日志,這是一件非常令人誤解的事情。
在正常情況下(不會發生錯誤),“子進程”和“父進程”日志的打印次數相同。
在異常情況下,盡管子進程始終成功創建,但它們並不相同。在這種情況下,不會打印“啟動進程失敗”和“無法創建子進程”日志。 請幫我咨詢。
請記住, stdio(3)已緩沖。 總是調用fflush(NULL);
(見fflush(3)之前對更多) fork
。 在每個printf(3)格式字符串的末尾添加一個\\n
(換行符)(否則,在fflush(NULL);
加上fflush(NULL);
...)。
函數execl(3) (也許您想要execlp
?)可能會失敗(因此在失敗時設置errno
)。
} else if (pid == 0) {
printf("Child process\n");
fflush(NULL);
execl("/bin/foo", "foo", "arg1", NULL);
// if we are here execl has failed
perror("Launch process fail");
}
出錯時, fork(2)失敗,返回-1並設置errno(3) (另請參閱perror(3)和strerror(3) )。 所以,你的最后else
應
} else {
perror("Can't create child process");
fflush(NULL);
}
您可能想使用strace(1) (特別是strace -f yourprog
...)來了解所涉及的syscall (請參閱syscalls(2) ...)
您的WriteLog
可能應該使用strerror
(在WriteLog
.... 開始時保存的errno
值上)。 我建議類似
void WriteLog(const char* msg) {
int e = errno;
if (e)
syslog (LOG_ERR, "%s [%s]", msg, strerrno(e));
else
syslog (LOG_ERR, "%s", msg);
}
參見syslog(3) 。
分叉進程的數量有限制,請參閱帶有RLIMIT_NPROC
和內置bash ulimit
setrlimit(2) 。
另請閱讀高級Linux編程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.