【问题标题】:Cannot execute binary file via execlp无法通过 execlp 执行二进制文件
【发布时间】:2013-06-19 20:16:26
【问题描述】:

我无法通过execlp 执行二进制文件。

chdir("/home/foo/bar/baz/MB/");
execlp("bash", "bash", "./foobarbaz 1", NULL);

foobarbaz 是我的 c 文件,我收到以下错误:

./foobarbaz: cannot execute binary file

我试过chmod +x foobarbaz.c

还有test.c 存在execlp 的文件。

我犯了什么错误?

【问题讨论】:

  • "foobarbaz 是我的 c 文件" 真的吗?你的意思是它是你编译的可执行文件还是它实际上是一个源代码文件?
  • 扩展名是.c
  • 在 bash 中,你能 cd /home/foo/bar/baz/MB/./foobarbaz 1 吗?
  • 是的。在 bash 我可以直接做到这一点。 @johnathan 是正确的。

标签: c linux


【解决方案1】:

您可以直接运行二进制文件:

execlp("./foobarbaz", "./foobarbaz", "1", (char *)0);

shell用于执行shell脚本(至少当你说bash ./foobarbaz 1时);您的二进制文件不是 shell 脚本。

【讨论】:

  • 只是一个要补充的问题:这是否意味着在执行完成之前不会返回 shell?
  • 使用execlp()时,不涉及shell;进程(你的./foobarbaz 程序)替换当前程序,当./foobarbaz 退出时进程终止。如果你通过 shell 调用它(比如bash),你可能会写:execlp("bash", "bash", "-c", "./foobarbaz 1", (char *)0); 然后你启动的 shell 会依次启动 ./foobarbaz,shell 会等待 ./foobarbaz 完成之前退出自己。但这意味着bash 替换了当前进程,而不是./foobarbaz,当然。
【解决方案2】:

当你编译一个 C 文件 - 比如 foo.c 你会得到一个输出二进制文件

cc foo.c

将 ./a.out 作为二进制文件提供

cc foo.c -o foo

将 ./foo 作为二进制文件提供

foo.c 不可执行。

【讨论】:

  • 我把它作为 ./foo 1 而不是 foo.c 1 ,对吧?为什么还是报错?
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多