0

fork()Linuxで外部コマンドを実行するためにとの組み合わせを使用してきましたが、実際のバイナリへのシンボリックリンクでexec()あるコードを実行しようとすると、コードが失敗するようです。/usr/bin/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;
}

編集:コードを更新して回答を含め、トピックのタイトルを変更しました。問題は実際にはシンボリック リンクが原因ではないように思われたからです。みんな、ありがとう。

4

2 に答える 2

1

の直後に何らかのコードを追加して、execvp何らかの診断を出力したい場合があります (つまり、 check errno意味のあるものを出力します ;))。

straceまたはを使用してソースを変更せずに分析することもできますgdb

も参照してくださいexecve

コメントからのフォローアップとして更新
Firefox はargv[0]空であることを快く思っていませんargList

教訓:argv実行するプログラムに何を渡すかを十分に認識してください。:)

于 2010-12-19T00:36:33.690 に答える
1

Firefox は空でない を持つことを主張しますargv[0]か? 通常、コマンドの名前 (「firefox」または「/usr/bin/firefox」のいずれか) をコマンドに渡す必要がありますが、そうしていません。


[...上記の詳細なコメントを確認します - これが正しい診断のようですが、21 分ほど遅れています...]

于 2010-12-19T01:31:17.230 に答える