2010-12-19 9 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; 
} 

は編集:私は答えを含めるために、コードを更新し、問題が本当にすべてでシンボリックリンクが原因であるようには見えなかったので、トピックのタイトルを変更しました。みんな、ありがとう。あなたは出力に右execvpた後、いくつかの診断いくつかのコードを追加したい場合があります

+0

あなたがそれを貼り付けるように、すでに実行中のFirefoxと、Firefoxが閉じられています。 Firefoxが既に開いている場合は、新しいタブが開きます。その他のエラーの詳細はありますか? –

+0

「失敗する」とはどういう意味ですか? – bk1e

+0

私は単にそれを動作させることができません、私は本当に何が間違っているのか分かりません:\ – pwseo

答えて

1

(すなわちerrnoをチェックし、意味のある印刷何かを;))。

straceまたはgdbを使用して、ソースの変更なしで分析することもできます。

も参照してください。execve

コメントからのフォローアップとして更新
FirefoxはargListが、残念ながら、どのように見えるかである、argv[0]が空であることに満足していないです。

教訓:実行したプログラムにargvとして渡すものを十分に理解してください。 :)

+0

私はexecvpの後に簡単なチェックを追加しました。 0に設定)。それはシンボリックリンクを実行しているようですが、firefoxを開かないようです:\ – pwseo

+2

execvpの後、動作したときに**何か他のものを実行しています** ... execvpは* no * forkです。 –

+0

それに、申し訳ありません。とにかく、子供の内部に小切手を追加しましたが、失敗するとexecvpは-1を返し、errnoは0以外の値に設定されています(アプリケーションが失敗し、エラーが報告されました)。しかし、firefoxでは、診断部分には決して行きません。成功したときと同じように、firefoxはまったく開かない(タブも窓もありません) – pwseo

1

Firefoxは空でないことを主張していますか?通常、コマンドの名前( "firefox"または "/ usr/bin/firefox"のいずれか)をコマンドに渡す必要がありますが、そうしないでください。


[...上記深いコメントをチェックしよう - そしてこれは正しい診断であるようだが、21分ほど遅れて...]これは私の両方のために働くようだ

+0

はい、それは本当に問題だった。私は答えで質問を更新します:) – pwseo

+0

@pwseo:それはそのようには動作しない珍しいプログラムです。 Firefoxが本当にargv [0]として空の文字列を渡すときに失敗するように意図されているかどうかMozillaに尋ねることがあります。ほぼバグです。そのために私のプログラムは正式には失敗しませんでした。彼らはほとんど一様にエラーをプログラム名 '' ** undefined ** ''でプレフィックスすると報告しますが、それは受け入れられると思います。 argv [0]の値を見て、プログラムの変種を判断してください。名前(argv [0])が認識されない場合、それらはデフォルト動作に戻ります。 –

関連する問題