通行证&燃气轮机&燃气轮机&引用;作为一个execv参数?

通行证&燃气轮机&燃气轮机&引用;作为一个execv参数?,c,grep,execv,C,Grep,Execv,我正在尝试将一些参数传递到execv调用中: char *const paramList[] = {"/bin/grep", "-rn", "comrade", "/home/sgspectra/Documents/testing_grep/", ">>", "output.txt", NULL}; 我相信“>>”和“output.txt”被解读为额外目录的参数,以便搜索,

我正在尝试将一些参数传递到execv调用中:

char *const paramList[] = {"/bin/grep", "-rn", "comrade", 
                           "/home/sgspectra/Documents/testing_grep/",
                           ">>", "output.txt", NULL};

我相信“>>”和“output.txt”被解读为额外目录的参数,以便搜索,而不是将输出发送到“output.txt”。是否可以发送一个只指示上一个参数是目录的参数?

当您在支持
>
的shell中键入命令时,shell将处理命令本身中的“>>文件名”。然后它将从命令行中删除该文本。命令行的其余部分(未删除的部分,包括您的命令和任何其他参数),然后传递给
execv
或其相关函数之一

要做同样的事情,你需要做的是以下几点:

  • 调用
    fork
    创建流程的子流程
  • 在父进程中(其中
    fork
    返回它所创建的子进程的进程ID),继续执行其他执行。父进程可能会等待子进程,也可能会继续执行其他操作
  • 在子级中(其中
    fork
    返回0),关闭文件描述符1(标准输出),并使用
    openat
    在文件描述符1的追加模式下打开
    output.txt
    。然后调用
    execv
(注意:我已经几十年没有做过这样的事情了,所以我的记忆可能已经改变,所需的精确步骤也可能已经改变。)


一个更粗糙但更易于编码的选项是使用
execv
执行shell,您可以传递参数,请求它解释和执行命令,包括重定向,如所示。

是一个shell。对于
execxxx()
不涉及shell。
exec
函数不执行重定向。您需要在追加模式下打开
output.txt
,然后使用
dup2
替换标准输出文件描述符。这必须在调用
exec
之前进行。谢谢您的回答!我设法使用了popen()最终得到我想要的结果。
fp=popen(“/bin/grep-rn comre.>>output.txt”,“r”);