将“>>”作为 execv 参数传递?

Passing ">>" as an execv argument?

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

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

我认为“>>”和 "output.txt" 被视为要搜索的其他目录的参数,而不是将输出发送到 "output.txt"。是否可以发送一个仅指示前一个参数是目录的参数?

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

要做同样的事情,您需要做的是:

  • 调用 fork 创建您的流程的子流程。
  • 在 parent 中(其中 fork returns 它创建的 child 的进程 ID),继续其他执行 - parent可能会等待 child 或者它可能会继续做其他事情。
  • 在child(其中forkreturns0),关闭文件描述符1(标准输出)并使用openat打开output.txt在文件描述符 1 处追加模式。然后调用 execv.

(买者自负:我已经几十年没有做过这样的事情了,所以我的记忆可能已经改变,所需的精确步骤可能已经改变。)

一个更粗略但 easier-to-code 的选项是使用 execv 执行一个 shell,你传递参数请求它解释和执行你的命令,包括重定向,如图所示在 .