隐藏Execve的终端输出

时间:2014-10-19 17:58:40

标签: c process hide output fork

我正在制作一个C程序,它基本上从用户读取一行,解释它然后尝试用execve执行命令。如果'&',我也会把这个行为分给一个孩子。在输入中。

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

2 个答案:

答案 0 :(得分:2)

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

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

  ...

  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 */

  ...

答案 1 :(得分:0)

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

首先,尝试在没有| echo $1 > /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;
}