簡體   English   中英

C / C ++ Linux fork()和exec()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM