【问题标题】:Trouble getting execl() to work [duplicate]无法让 execl() 工作[重复]
【发布时间】:2017-07-03 09:54:13
【问题描述】:

我在让 execl 工作时遇到问题。

pid_t pid = fork();

if(pid<0) {
perror("fork error\n");

} else if( pid== 0){
execl("/home/"user name"/opSys", "ps", ">>", "test.txt", (char*)NULL);

} else  {

int returnStatus;
waitpid(pid, &returnStatus, 0);

}

我试图让它运行命令,然后输出到我的文本文件,但是没有任何反应。我一直在谷歌搜索并尝试我找到的东西,比如不同的高管。我已经尝试过 execlp(),我试图让它使用 ps ant 而不是将它放入文件中。

如果这个问题已经得到解答,我深表歉意,我确信它已经得到解答,但是我找不到适合我的解决方案。 提前致谢。

【问题讨论】:

  • 向我解释这个"/home/"user name"/opSys"
  • 是帖子中的拼写错误,我已修复。
  • &gt;&gt; 是一个 shell 操作符。 execl 不明白这一点。它将&gt;&gt; 传递给opSys 程序而不是shell。这不是你想要的。
  • 你检查execl的返回值了吗?实际上,它只有在失败时才会返回。在这种情况下检查errno

标签: c unix


【解决方案1】:

我假设您的命令中的 &gt;&gt; 应该创建输出重定向。然而,这里的情况并非如此。当在命令行中给出时,运算符&gt;&gt;shell 解释;该命令仅获取参数并排除它。然后,shell 会注意文件描述符是否被正确地破坏以进行重定向。

在您的情况下,该命令将获得三个参数,即给定的字符串ps&gt;&gt;test.txt。这就像打字

 command ps '>>' test.txt

您调用的命令可能不会做太多事情,可能会在 stderr 上给出一条错误消息,说明它收到的错误参数(您可能错过了)。

我建议你尝试调用一个 shell 来帮助你解释你的命令并将你的命令作为字符串传递:

execl("/bin/sh", "-c", "/home/"user name"/opSys ps >> test.txt",
    (char*)NULL);

【讨论】:

  • 顺便说一句,我希望你的 username 是一些对没有空格的字符串进行评估的宏,否则这是另一个问题,你必须在路径周围放置单引号来转义空格: "'/home/"user name"/opSys' ps &gt;&gt; test.txt".
  • 非常感谢 Alfe,这解决了我的问题。我不得不做 execl("/bin/sh", "sh"....);首先,但我的问题已解决。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2012-03-17
相关资源
最近更新 更多