2016-08-13 199 views
1

如何從C執行/打開/運行另一個程序,而不是阻止它,但讓它同時運行。然後我想做一些測試,如服務器/客戶端,然後如果這已經完成,我想殺死/關閉此程序。我已閱讀約從C打開/運行另一個程序,然後關閉這個程序

system() or execv() 

但首先似乎阻止了等待結果,第二似乎只在Linux上工作?在最好的情況下,我希望有跨平臺或最低的MacOS/Windows/Linux(Ubuntu)工作解決方案。當我不再需要它時,我也需要關閉這個以前打開的程序。

回答

3

POSIX的方式做到這一點(這也許可以在Windows下使用呢? - https://technet.microsoft.com/en-us/library/bb463220.aspx)任何想法 是使用fork + exec*組合:

您可以使用fork來創建複製當前進程的新進程。 你的句柄過程是一個INT進程標識符(PID):

int pid; 

if (0 > (pid=fork()){ 
    perror("fork failed"); 
    return -1; 
} 
if (0 == pid){ 
    //CHILD PROCESS 
    printf("I'm the child process, my pid is: %d\n", getpid()); 

} 
//pid > 0 ==> PARENT PROCESS 
puts ("I'm the parent process"); 
printf("The pid of the child I've just spawned is %d\n", pid); 

要運行在子進程中的可執行文件,使用exec*功能,以取代目前的(例如,孩子的,如果你在兒童中運行它)使用從可執行文件加載的過程映像處理映像。

在家長,您可以再使用PID句柄kill過程(=要求其終止):

kill(pid, SIGTERM); //please terminate 

,您可以使用waitpid檢索其退出狀態已經終止之後。


system內部使用fork + execv(IT高管殼)+ waitpid。因爲waitpid部分不system分開,system讓你等待子進程結束。)

你可能也想看看dup2pipesocketpair建立一個基於fildescriptor,通信信道與子進程(也有其他選項,如共享內存,消息隊列,或信號如果你只需要非常基本的溝通)。

manpages是管理進程和IPC的很好的資源。

+0

thx這有助於很多:)我想我將在未來使用它,但現在我重新設計我的測試更簡單:1.在單獨的pthread上運行測試服務器2.執行shell cmd以使用popen()3回顯此服務器。獲取cmd輸出並聲明它是正確的。 –

0

如何執行/開/由C運行另一個程序?

使用system

如何不就可以阻止?

你必須實現多任務處理,所以使用fork創建另一個進程或pthread_create 創建另一個線程,看看this

我想有跨平臺或最小的MacOS/Windows/Linux(Ubuntu)工作解決方案。

system作品在Linux和Windows,但我沒有對其他平臺

+0

確定thx,但我可以以後關閉它嗎? –

+0

@MichałZiobro,不客氣,有問題嗎? – Mouin

相關問題