exec () не работает с firefox - PullRequest
       34

exec () не работает с firefox

0 голосов
/ 19 декабря 2010

Я использовал комбинацию fork() и exec() для выполнения какой-либо внешней команды в linux, однако код, похоже, дает сбой всякий раз, когда я пытаюсь выполнить /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;
}

Редактировать: я обновилкод для включения ответа и изменения заголовка темы, потому что проблема на самом деле не связана с символическими ссылками.Спасибо всем.

Ответы [ 2 ]

1 голос
/ 19 декабря 2010

Настаивает ли Firefox на непустом argv[0]? Обычно вы должны передавать имя команды (либо просто «firefox», либо «/ usr / bin / firefox») команде, но вы этого не делаете.


[... собираюсь проверить более глубокие комментарии выше - и кажется, что это правильный диагноз, но примерно на 21 минуту позже ...]

1 голос
/ 19 декабря 2010

Возможно, вы захотите добавить код сразу после execvp для вывода некоторой диагностики (т. Е. Проверить errno, напечатать что-нибудь значимое ;)).

Вы также можете попробоватьпроанализировать его без модификации источника, используя strace или gdb в этом отношении.

См. также: execve.

Обновление в соответствии с комментариями
Firefox недоволен тем, что argv[0] пусто, как, к сожалению, argList выглядело.

Урокивыучены: Тщательно осознайте, что вы передаете как argv программе, которую вы выполняете. :)

...