通过“ >>”作为execv参数?

时间:2018-09-24 23:56:36

标签: c grep execv

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

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

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

1 个答案:

答案 0 :(得分:0)

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

要做同样的事情,您需要做的事情大致如下:

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

穴居人:自从我做了这样的事情已经过去了几十年,所以我的记忆可能已经改变,所需的确切步骤可能已经改变。)

一个更简单但更容易编码的选项是使用execv执行一个shell,您传递参数来请求它解释和执行命令,包括重定向,如this answer所示。