首页 > 解决方案 > 将“>>”作为 execv 参数传递?

问题描述

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

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

我相信“>>”和“output.txt”被读取为其他目录的参数来搜索而不是将输出发送到“output.txt”。是否可以发送一个仅指示前一个参数是目录的参数?

标签: cgrepexecv

解决方案


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

为了做同样的事情,你需要做的事情是:

  • 调用fork以创建您的流程的子流程。
  • 在父进程中(其中fork返回它创建的子进程的进程 ID),继续执行其他操作——父进程可能等待子进程,或者它可能继续执行其他操作。
  • 在子进程中(其中fork返回 0),关闭文件描述符 1(标准输出)并使用在文件描述符 1 处以附加模式openat打开。然后调用.output.txtexecv

注意事项:我做这样的事情已经有几​​十年了,所以我的记忆可能已经改变,所需的精确步骤可能已经改变。)

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


推荐阅读