管道中的东西,系统()失败了

时间:2013-12-02 14:29:36

标签: c piping

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

#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

纳米失败:

received SIGHUP or SIGTERM

是否有更安全的方法来执行系统命令? 我已经尝试重定向stdin。

1 个答案:

答案 0 :(得分:1)

system'ed程序从调用system的进程继承其stdin。在nano(以及大多数其他文本编辑器,我想象)的情况下,当stdin不是终端时,这是一件坏事。

您应该可以通过在命令字符串中添加< /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元字符时,你会得到一点点,但这是一个无关的问题......)