0

在 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 #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?

4

2 回答 2

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().

于 2015-02-13T00:17:59.167 回答
1

首先,重定向运算符 like>由 shell 解释,对execve(2)(或回显)没有任何意义。您可以尝试改用system(3) ,或者您可以自己设置重定向,方法是打开输出文件并使用dup2(2)将标准输出设置为生成的文件描述符(请参阅此问题)。

其次,write_cmd是一个数组char*,但是'>'(注意单引号)有类型int。这实际上意味着您将一个整数放入一个包含指向字符串的指针的数组中。你可能打算写">".

于 2015-02-13T00:15:58.777 回答