【问题标题】:Hide terminal output from Execve隐藏 Execve 的终端输出
【发布时间】:2014-12-14 17:24:50
【问题描述】:

我正在制作一个 C 程序,它基本上从用户那里读取一行,解释它,然后尝试使用 execve 执行命令。如果输入中包含“&”,我还将 execve 分叉给子进程。

现在我希望在子进程中运行时隐藏来自 execve 命令的任何终端输出。 有没有相对简单的方法来做到这一点?

【问题讨论】:

    标签: c process hide output fork


    【解决方案1】:

    您可以通过在 fork 之后但在 execve() 之前将 stdout 和 stderr 重定向到 /dev/null 来隐藏输出。这个想法是打开/dev/null,然后使用dup2() 制作获得的文件描述符的stdout 和stderr 副本(这也将首先关闭原始文件)。这几乎与重定向到管道相同。

    一个例子(不完整的程序,并跳过大多数错误检查):

      #include <unistd.h>
      #include <fcntl.h>
      ...
    
      int pid = fork();
      if (pid == -1) {
        /* fork error */
        exit(1);
      } else if (pid == 0) {
        /* child process */
    
        /* open /dev/null for writing */
        int fd = open("/dev/null", O_WRONLY);
    
        dup2(fd, 1);    /* make stdout a copy of fd (> /dev/null) */
        dup2(fd, 2);    /* ...and same with stderr */
        close(fd);      /* close fd */
    
        /* stdout and stderr now write to /dev/null */
        /* ready to call exec */
    
        execve(cmd, args, env);
        exit(1);
      } else {
        /* parent process */
    
      ...
    

    【讨论】:

      【解决方案2】:

      我写了一个简单的例子,也许对你有帮助。

      首先,尝试在没有| echo $1 &gt; /dev/null 的情况下调用它——它应该打印文件。添加时,输出为空。

      #include <stdio.h>
      #include <unistd.h>
      
      int main()
      {
              int ret;
              char *cmd[] = { "ls", "-l", (char *)0 };
              char *env[] = {(char *)0 };
              ret = execve ("/bin/ls | echo $1 > /dev/null", cmd, env);
              return 0;
      }
      

      【讨论】:

      • 这不应该工作(也不适合我)。它尝试使用的 IO 重定向将由 shell 处理——但 execve 不使用 shell 来运行命令。它似乎只能工作,因为当execve 失败时,它根本没有运行/bin/ls
      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 2021-01-27
      • 2017-06-18
      • 1970-01-01
      • 2021-07-12
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多