如何将重定向运算符’>’作为execv的参数传递?

在linux终端中,我可以输入

echo hello! > /path/to/file 

我以为我可以用execv做同样的事情:

 #include  #include  #include  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 #include #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; } 

但是,这并没有给我我想要的结果。 这写’你好!’ 到文件,但它也会覆盖已经写在文件上的所有其他内容。 我怎么能保证’你好!’ 将被写入文件的END?

首先,像>这样的重定向运算符由shell解释,并且没有任何意义来执行(2) (或者回声,就此而言)。 您可以尝试使用system(3) ,或者您可以通过打开输出文件并使用dup2(2)将标准输出设置为生成的文件描述符来自行设置重定向(请参阅此问题 )。

其次, write_cmdchar*的数组,但是'>' (注意单引号)的类型为int 。 这实际上意味着您在一个数组中放入一个整数,否则该数组包含指向字符串的指针。 你可能想写">"

你可以,但只能间接地。

>重定向操作符由shell解释; /bin/echo无法识别它,并将其视为另一个要打印的参数。

如果希望shell执行重定向,则需要调用/bin/sh并将整个命令作为参数传递给它。

未经测试的代码如下:

 char *write_cmd[] = { "/bin/sh", "-c", "echo hello! > /path/to/file", NULL }; // ... execv("/bin/sh", write_cmd); 

或者,更简单地说,您可以使用system()