在linux终端中,我可以输入
echo hello! > /path/to/file
我以为我可以使用execv做同样的事情:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(void){
char *write_cmd[] = { "echo", "hello!", ">", "/path/to/file", NULL};
if (fork() == 0){
execv("/bin/echo", write_cmd);
}
else{
sleep(1);
}
return 0;
}
但是,这段代码不会写'你好!'到文件,这是我想要它做的。还有另一种方法可以使用execv和echo吗?
编辑: 我也尝试过使用dup2作为解决方案: #包括 #包括 #include
int main(void){
char *write_cmd[] = { "echo", "hello!", NULL };
if (fork() == 0){
int tmpFd = open("/path/to/file", O_WRONLY);
dup2(tmpFd, 1);
execv("/bin/echo", write_cmd);
close(tmpFd);
exit(0);
}
else{
sleep(1);
}
return 0;
}
然而,这并没有给我我想要的结果。这写'你好!'到文件,但它也覆盖已经写在文件上的所有其他内容。我怎么能保证'你好!'将被写入文件的结尾?
答案 0 :(得分:2)
你可以,但只是间接地。
>
重定向运算符由shell解释; /bin/echo
无法识别它,并将其视为另一个要打印的参数。
如果您希望shell执行重定向,则需要调用/bin/sh
并将整个命令作为参数传递给它。
未经测试的代码如下:
char *write_cmd[] = { "/bin/sh", "-c", "echo hello! > /path/to/file", NULL };
// ...
execv("/bin/sh", write_cmd);
或者,更简单地说,您可以使用system()
。
答案 1 :(得分:1)
首先,像>
这样的重定向运算符由shell解释,对execve(2)没有任何意义(或者就此而言是回声)。您可以尝试使用system(3),也可以通过打开输出文件并使用dup2(2)将标准输出设置为生成的文件描述符来自行设置重定向。(请参阅this question)。
其次,write_cmd
是char*
的数组,但'>'
(注意单引号)的类型为int
。这实际上意味着您在一个数组中放入一个整数,否则该数组包含指向字符串的指针。你可能想写">"
。