以下是重现我的问题的示例代码:
#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。
答案 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元字符时,你会得到一点点,但这是一个无关的问题......)