2010-12-19 88 views
0

我一直在使用fork()exec()的組合來在linux上執行一些外部命令,但是,當我試圖執行/usr/bin/firefox這個代碼似乎失敗了,這是一個符號鏈接到一個真實二進制文件。exec()不支持firefox

有誰知道如何解決這個問題?我測試過其他程序(實際上是可執行的二進制文件,而不是符號鏈接),它的工作原理。

下面是程序代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <string.h> 
#include <errno.h> 

int main(int argc, char **argv) { 
    pid_t pid; 
    // this was the old line: 
    // char *parmList[] = {"", "index.html", NULL}; 
    // and this is the one that solves the problem: 
    char *parmList[] = {"firefox", "index.html", NULL}; 
    int a; 

    if ((pid = fork()) == -1) 
    perror("fork failed"); 

    if (pid == 0) { 
    a = execvp("/usr/bin/firefox", parmList); 
    fprintf(stdout, "execvp() returned %d\n", a); 
    fprintf(stdout, "errno: %s (%d).\n", strerror(errno), errno); 
    } 
    else { 
    waitpid(pid, 0, 0); 
    } 

    return 0; 
} 

編輯:我更新的代碼包含的答案,換了個話題的標題,因爲確實似乎問題不是是由於符號鏈接的。感謝大家。

+0

這似乎爲我工作都當你粘貼它時,Firefox已經運行並且Firefox已經關閉。如果Firefox已經打開,它會打開一個新標籤頁。你有沒有其他的錯誤細節? – 2010-12-19 00:36:01

+0

「你好像失敗了」是什麼意思? – bk1e 2010-12-19 00:47:06

+0

我根本無法得到它的工作,我只是真的不知道什麼是錯的:\ – pwseo 2010-12-19 00:53:25

回答

1

您可能希望在execvp輸出之後添加一些代碼一些診斷(即檢查errno,打印的東西有意義;))。

您也可以嘗試使用stracegdb來分析它,而不使用源修改。

另請參閱:execve

更新從評論
火狐隨訪不滿意argv[0]是空的,這是什麼argList樣子,很遺憾。

經驗教訓:徹底瞭解您通過argv執行的程序。 :)

+0

我加execvp經過簡單的檢查(和它未返回-1,它的工作,這意味着)和錯誤號(這是設置爲0)。它看起來就像是執行符號連接,但不開放的Firefox:\ – pwseo 2010-12-19 00:54:05

+2

execvp之後,當它的工作,你正在執行**別的** ... execvp是*否*叉。 – 2010-12-19 00:55:40

+0

權利,我們對此深感抱歉。不管怎麼樣,我只是說孩子內部的檢查,當它出現故障時,execvp返回-1,errno設置爲0以外的東西(我是故意和錯誤應用程序失敗的報道)。與Firefox,但是,它不會繼續執行診斷的一部分,就像發生了什麼,當它成功了,只是它不會在所有的Firefox(無標籤,無窗) – pwseo 2010-12-19 00:59:29

1

火狐是否堅持有一個非空argv[0]?您通常應該將該命令的名稱(無論是「firefox」還是「/ usr/bin/firefox」)傳遞給該命令,但您並未這樣做。


[...去檢查上面的更深層次的意見 - 而且似乎這是正確的診斷,但有21分鐘左右的時間晚了...]

+0

是的,這確實是問題所在。我會更新問題的答案:) – pwseo 2010-12-20 11:58:56

+0

@pwseo:這是一個不尋常的程序,不會像那樣工作;你可能會關心在Mozilla中詢問Firefox是否真的打算在通過空字符串argv [0]傳遞時失敗。這幾乎是一個錯誤。我的節目都沒有因此而正式失敗;他們幾乎可以一致地用程序名「** undefined **」加上前綴來報告錯誤,但我認爲這是可以接受的。少數看argv [0]的值來確定它們是哪個程序的變體;如果名稱(argv [0])未被識別,那麼這些屬性會回到默認行爲。 – 2010-12-20 15:35:06