如何传递重定向运算符'>'作为execv的论据?

时间:2015-02-13 00:07:56

标签: c echo io-redirection execv

在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;
}

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

2 个答案:

答案 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_cmdchar*的数组,但'>'(注意单引号)的类型为int。这实际上意味着您在一个数组中放入一个整数,否则该数组包含指向字符串的指针。你可能想写">"