2014-02-11 52 views
3

情況如下:我分叉進程以使用默認瀏覽器打開html文件。這裏是如何看起來在我的情況:獲取由xdg-open創建的進程的PID

if ((pid=fork())==0) { 
    execlp("/usr/bin/xdg-open", "xdg-open", url, NULL); 
    /*if execlp failed, exit the child*/ 
    exit(0); 
} 

不過,我想要得到的過程(打開瀏覽器)的PID的保持,這樣我就可以關閉它以後了。但我似乎不知道我怎麼能得到它。如果您有任何建議,請告訴我。

回答

0

fork()將子進程的PID返回給父進程。

在孩子,你可以獲得它自己的標準getpid() pid。

pid_t child_pid = fork(); 

if (child_pid < 0) { 
    perror("fork"); 
    // error handling 
} else if (!child_pid) { 
    // child goes here 
    pid_t my_pid = getpid(); 
} else { 
    // parent continues here 
} 
1

你應該已經有子進程的PID,叉的手冊頁()說:

成功時,子進程的PID返回父, 和0在兒童中返回。

所以在子進程中你檢測到0並運行你的程序,在父pid中將是子實際的PID。

根據你的評論,接下來會發生的事情是,xdg-open進程 - 你現在是誰的PID將依次啓動瀏覽器,並且你沒有直接訪問該瀏覽器進程的PID。

目前我唯一能想到的就是創建另一個子進程,你運行一個命令,比如ps或者pgrep,然後你可以解析這個命令的輸出來找到瀏覽器的PID作爲xdg-open的孩子運行。有一個讀取子進程輸出的例子here

+1

我不這麼認爲。子進程將運行xdg-open。但是,如果我理解正確,瀏覽器將在另一個進程中打開。所以PID將會不同。 – elena

+0

@elena:從man 3 exec':'exec()系列函數用新的過程映像替換當前過程映像.'作爲替換,不需要創建新過程,因此不需要新過程-id被分配。 – alk

+1

是的,我閱讀手冊頁。但是,如果你看看我的例子:execlp(「/ usr/bin/xdg-open」,「xdg-open」,url,NULL),你會看到xdg-open是被替換的過程映像。反過來,xdg-open會打開瀏覽器(因爲url是一個html頁面)。瀏覽器將運行在一個新的過程中。所以我需要這個過程的PID。 – elena