2017-10-21 122 views
0

有一個程序,我可以像這樣在終端中運行:./program &C - 如何使用exec在後臺運行程序?

但我試圖做使用execvp它,它不工作:

  pid = fork(); 
      char *argv[3] = {"./program", "&", NULL}; 

      if (pid == 0) { 
       execvp(argv[0], argv); 
      } 
      else{ 
       wait(NULL); 
      } 

我幹了什麼錯在這裏做什麼?

+0

普萊舍**編輯您的問題**來激勵它,真正解釋你想做。 –

回答

2

您在argv陣列中的"&"不會執行您想要的操作,並且可能是您的問題的來源。這是一個程序參數的地方,&是一個shell命令,而不是程序參數。刪除它,因爲./program由於分叉而將在單獨的進程中運行。

+2

我會說'&'是一個shell *語法*;它本身不是一個命令。 –

1

由於answered by Greg Hewgill,結尾&是與job control相關的shell語法(它在技術上不是shell命令)。

在你的問題,目前還不清楚爲什麼你需要它。你可以不使用"&",你的代碼應該可以工作。另請參閱約background processes,約terminal emulators,約process groups。閱讀tty demystified

順便說一句,你可以代替wait使用waitpid(2)並指定PID。您一般需要等待一些(例如waitwaitpidwait4(2),等...),以避免zombie processes。您可能要處理的SIGCHLD信號,但讀signal(7) & signal-safety(7)

也許你想使用daemon(3)功能。另請參閱setsid(2)setpgrp(2)credentials(7)。否則,您可能應該在程序中稍後調用wait。你可能想(用dup2(2))重定向,也許是/dev/null,其他一些open(2) -ed文件描述符,一些pipe(7),等等,的標準輸入(和/或標準輸出標準錯誤)您子進程。您可能還想要使用poll(2)來複用輸入或輸出。

您的代碼應爲handle the failurefork(2)(當它給出-1)時,可能在此情況下使用perror(3)。您還應該處理execvp(3)的失敗。

在一些有限的和具體的特殊情況下,你可以想popen(3)一個shnohup(1)batchat,或bash但通常不需要這樣。

(不理解你的動機,爲什麼要在background運行的東西,我們不能幫助你更多)