2013-08-30 93 views
4

我有這樣的命令:如何從C執行命令,並終止其

./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www " 

通過以太網視頻流。目前我正在運行終端,而對於退出,我只需按Ctrl + c。但我需要使用c代碼來做到這一點。有沒有可能或有其他方法可用?

謝謝。

+0

再次殺死這個過程中瞭解[叉(2)](http://man7.org /linux/man-pages/man2/fork.2.html)和[execve(2)](http://man7.org/linux/man-pages/man2/execve.2.html)[Advanced Linux Programming ](http://advancedlinuxprogramming.com/),也許關於[popen(3)](http://man7.org/linux/man-pages/man3/popen.3.html) –

回答

7

從技術上講,您可以通過使用fork()exec系列來完成您需要做的事情。

它可能像這樣工作:

pid_t PID = fork(); 
if(PID == 0) { 
     execl("yourcommandhere"); 
     exit(1); 
} 
//do Whatever 
kill(PID, 15); //Sends the SIGINT Signal to the process, telling it to stop. 

execl(或任何其他家庭成員,請看這裏:http://linux.die.net/man/3/execl),將取代你打電話的過程中,當前進程。這是我們用fork創建的子進程。 Fork爲子進程返回'0',並將子進程的實際進程ID返回給原始進程調用fork,從而給出原始進程控制權。

通過調用kill並提供SIGINT(15),您正在使用指定的PID(您從fork中獲得)告訴進程停止。 exit(1)是必要的,否則,如果execl應該失敗,那麼您將有兩個進程在您手中執行相同的操作。這是一個故障安全。

我希望這會有所幫助。

+0

這一切後,調用'waitpid函數(PID,NULL,0);'告訴你與孩子進程句柄完成的內核。 – aschepler

+0

我可以在沒有退出(1)的情況下執行此操作,因爲我不想在殺死後退出我的主程序。 – Haris

+1

@Haris'exit'隻影響子進程,它是mjpg_streamer軟件,但不是主進程。正如你所看到的,只有當PID等於0時纔會調用它,這會導致主進程跳過它,因爲'fork'返回該進程的實際PID。 –

1

usaually我們使用系統(「command」);

複製整個命令到可以說海峽

./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www " 

轉換爲字符串,然後用

system(str); //in c code. 
+1

是的,我知道..但是終止...... – Haris

+2

@Gangadhar事情是,系統凍結了程序,因爲它等待你剛纔調用完成的過程。基本上'system'調用:'fork()','execl()'和'wait()'。 –

+0

@RefugnicEternium,是的同意,你建議的方式在這種情況下工作正常。感謝您指出這一點。 – Gangadhar

1
./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www " 

pkill mjpg_stramer 

你可以調用pkill的使用system()

+0

但是,如果你'系統'的第一個命令,它不會返回。 – aschepler

+0

你可以把&符號在第一個命令結束,這樣它異步運行 - 即mjpg_streamer將在「後臺」,而你的C程序繼續運行。 – mti2935

1

當你與system(./mjpg_streamer)

執行創建mjpg_streamer一個用戶進程

您可以pkill(mjpg_streamer)

+1

不,當mjpg_streamer仍在運行時,第一次調用'system'將不會返回。 – aschepler