这个小命令:
execlp("/bin/echo", "echo", "*", ">", "toto", 0)
在终端中打印* > toto
,但我希望它在文件toto中打印echo *
的结果。
命令:system("echo * > toto")
运行良好,但我想使用excelp命令,我做错了什么?
提前谢谢。
答案 0 :(得分:2)
尖括号('>')重定向是特定于shell的。
你可以做,例如:
execlp("/bin/sh", "/bin/sh", "-c", "/bin/echo * > toto", NULL);
请注意,这会调用2个与shell相关的特定行为:
echo
命令的标准输出将被重定向到文件(或管道)toto
。如果你想在C中进行相同类型的重定向(即不需要执行shell),你必须:
// open the file
int fd = open("toto", "w");
// reassign your file descriptor to stdout (file descriptor 1):
dup2(fd, 1); // this will first close file descriptor, if already open
// optionally close the original file descriptor (as it were duplicated in fd 1 and is not needed anymore):
close(fd);
// finally substitute the running image for another one:
execlp("/bin/echo", "echo", "*" 0);
请注意,您仍然可以获得' *'写到文件。
编辑: execlp
的第一个参数实际上是要运行的可执行文件,文件图像将替换当前正在运行的进程。在第一个参数出现后,完整的argv
数组必须包含argv[0]
。我已经编辑了上面的代码来反映这一点。有些程序使用此argv[0]
来更改其个性(例如,busybox
是一个可执行ls
,echo
,cat
和许多其他unix命令的可执行文件线路公用事业); bash
以及从/bin/sh
链接的内容肯定是这种情况。