我一直在使用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;
}
编辑:我更新了代码以包含答案并更改了主题的标题,因为问题实际上似乎根本不是由符号链接引起的。谢谢大家。
答案 0 :(得分:1)
您可能希望在execvp
之后添加一些代码以输出某些诊断信息(例如,检查errno
,打印某些有意义的;))。
您也可以尝试使用strace
或gdb
对其进行分析。
另请参阅:execve
。
更新后续评论
Firefox不满意argv[0]
是空的,不幸的是argList
看起来像。{/ p>
经验教训:充分了解您作为argv
传递给您执行的程序的内容。:)
答案 1 :(得分:1)
Firefox是否坚持使用非空argv[0]
?您通常应该将命令的名称(只是“firefox”或“/ usr / bin / firefox”)传递给命令,但您没有这样做。
[...要检查上面的更深层次的评论 - 这似乎是正确的诊断,但是迟到了21分钟......]