【问题标题】:system() fails when piping stuff in [duplicate]在 [重复] 中管道时 system() 失败
【发布时间】:2013-12-02 14:29:35
【问题描述】:

这是重现我的问题的示例代码:

#include <stdio.h>
int main()
{
    char *f = "toto.txt";
    char cmd[64];

    sprintf(cmd, "nano %s", f);
    system(cmd);
    return 0;
}

如果我这样做:

./test

一切都很好,但如果我这样做:

echo "blah"|./test

Nano 失败:

received SIGHUP or SIGTERM

有没有更安全的方法来执行系统命令? 我已经尝试过重定向标准输入。

【问题讨论】:

  • AFAIK,管道是由 shell(例如 Bash)实现的,因此无法通过 system() 获得。
  • @Claudio 但他并没有尝试这样做......程序的行为会根据 OP 如何从 shell 调用它而改变。
  • 关于SIGHUP的错误信息来自nano。您可以尝试从 shell 运行 nano (echo "blah" | nano somefile"),它仍然会显示相同的消息。
  • @DanFego 确实如此。我想我不会使用标准输入,那么。没什么大不了的:)

标签: c piping


【解决方案1】:

system'ed 程序从调用 system 的进程继承其标准输入。对于nano(以及大多数其他文本编辑器,我想),当标准输入不是终端时,这是一件坏事。

您应该能够通过将&lt; /dev/tty 添加到命令字符串来修复它。

sprintf(cmd, "nano %s < /dev/tty", f);

您可以先检查 stdin 是否为 tty,并仅在需要时应用重定向,如下所示:

if(isatty(0))
    sprintf(cmd, "nano %s", f);
else
    sprintf(cmd, "nano %s < /dev/tty", f);

(当您的 f 中包含任何 shell 元字符时,您会觉得有点麻烦,但这是一个不相关的问题......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2015-10-12
    • 2021-10-09
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多