【问题标题】:exec() not working with firefoxexec() 不适用于 Firefox
【发布时间】:2010-12-19 00:28:25
【问题描述】:

我一直在使用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;
}

编辑:我更新了代码以包含答案并更改了主题的标题,因为问题似乎根本不是由符号链接引起的。谢谢大家。

【问题讨论】:

  • 当您粘贴它时,这似乎对我来说既适用于已经运行的 Firefox,又适用于关闭的 Firefox。如果 Firefox 已经打开,它会打开一个新选项卡。您还有任何其他错误详细信息吗?
  • “似乎失败了”是什么意思?
  • 我根本无法让它工作,我真的不知道出了什么问题:\

标签: c firefox exec fork argv


【解决方案1】:

您可能想在execvp 之后添加一些代码以输出一些诊断信息(即检查errno,打印一些有意义的内容 ;))。

您也可以尝试使用stracegdb 对其进行分析,而无需修改源代码。

另请参阅:execve

cmets 后续更新
Firefox 不满意 argv[0] 是空的,这就是 argList 的样子,不幸的是。

经验教训:彻底了解您将argv 传递给您执行的程序的内容。 :)

【讨论】:

  • 我在 execvp(它没有返回 -1,这意味着它有效)和 errno(设置为 0)之后添加了一个简单的检查。看起来它正在执行符号链接但没有打开 firefox:\
  • 在 execvp 之后,当它工作时,你正在执行 something else... execvp 是 no fork。
  • 对,对此感到抱歉.. 无论如何,我只是在孩子内部添加了一个检查,当它失败时,execvp 返回 -1 并且 errno 设置为 0 以外的值(我让应用程序失败目的和错误已报告)。然而,使用 firefox,它永远不会进入诊断部分,就像它成功时发生的那样,只是它根本不打开 firefox(没有选项卡,没有窗口)
  • 听起来你的 Firefox 没有启动 ;)。
  • 我摆弄了一下,似乎 parmList 中的第一个字符串不能是“”。那么,感谢所有帮助:)
【解决方案2】:

Firefox 是否坚持使用非空的argv[0]?您通常应该将命令的名称(只是“firefox”或“/usr/bin/firefox”)传递给命令,但您没有这样做。


[...要去检查上面更深的 cmets - 似乎这是正确的诊断,但晚了 21 分钟左右...]

【讨论】:

  • 是的,这确实是问题所在。我会用答案更新问题:)
  • @pwseo:这是一个不寻常的程序,不会那样工作;您可能会在 Mozilla 询问 Firefox 是否真的打算在将空字符串作为 argv[0] 传递时“失败”。这几乎是一个错误。我的任何程序都不会因此而正式失败。他们几乎一致地会报告带有前缀“**undefined**”的程序名称的错误,但我认为这是可以接受的。一些人查看 argv[0] 的值来确定它们是程序的哪个变体;如果名称 (argv[0]) 无法识别,则它们会退回到默认行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多