【发布时间】:2016-09-22 10:56:47
【问题描述】:
我想从 C 文件运行 execlp() 并将结果写入某个输出文件。 我用这条线:
buff = "./cgi-bin/smth";
execlp(buff, buff, "> /cgi-bin/tmp", NULL);
其中 smth 是编译后的 c 脚本。 但是 smth 打印到标准输出,并且没有文件出现。 会发生什么,以及如何将脚本结果放入输出文件?
【问题讨论】:
-
“会发生什么?” - 你运行程序
./cgi-bin/smth,第零个参数是./cgi-bin/smth,第一个参数是> /cgi-bin/tmp。正是你要求发生的事情发生。 -
shell 为你做 I/O 重定向;如果您正在编写“外壳”,则必须自己完成。最简单的解决方法是使用
system("./cgi-bin/smth > /cgi-bin/tmp");(你确定文件不应该是./cgi-bin/tmp吗?)。否则,您必须在程序中打开该文件并安排标准输出到该文件 - 使用dup2()、close()和open(),而不是按此顺序。 -
在处理不受信任的数据时,直接调用
exec*-family 系统调用比通过system()更安全的原因是不支持 shell 样式的重定向、扩展和其他特定于 shell 的魔法。如果它的行为与您在此处描述的不同,那么在 UNIX 上编写安全软件几乎是不可能的。