有一個觀念需要澄清一下, fork() 的回傳值有以下三種情況
-1: fork() 發生錯誤, 無 child process 產生.
0: 在child process裡
>0: 在parent process裡, fork() 回傳值, 即是 child process 的 PID
請看下面這個例子:
pid_t pid;
if ((pid = fork()) < 0) {
/* Error */
return 1;
} else if (pid == 0) {
/* Child process */
/* 在此,你可以執行exec系列函式 */
execv("/usr/local/bin/dillo", NULL);
/* 有一點要注意, 成功呼叫 execv 之後, 以下敘述都不會執行 */
printf("execv() failed\n"); /* 只有失敗了才會執行到這行 */
}
/* Parent process */
/* dillo 的 PID 對 parent process 來說, 就是 fork() 回傳值 */
printf("PID of dillo is %d\n", pid);
最後, 你提出的兩個問題, 回答如下:
※ 引述《vtr198172 (43米的深海)》之銘言:
: 我有一個UI的主程式叫main,目前想利用exec和fork來做到:
: (1)按下按鈕A, 開啟程式dillo
: BUTTON A:
: pid_t dillo_pid;
: dillo_pid = fork();
: execv("/usr/local/bin/dillo&", NULL); <== 這段有問題
: (2)按下按鈕B, 結束程式dillo
: BUTTON B:
: system("kill -9 dillo_pid");
: 但是有幾個問題不知道要如何處理,
: 1. execv這段程式不知道要如何寫才能讓dillo在背景執行?
答: 當你 fork 之後再執行 execv 時, 其功能就已經等於在 shell 上執行 dillo& 了.
無須再加 &, (其實加了也沒有作用).
: 2. 要如何取得dillo的PID,因為fork()回傳的值是0,1,-1,不是dillo的pid
答: 上面的例子可以參考看看.
: 開發平台: ( Linux)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.249.207.134