我正在制作一个C程序,它基本上从用户读取一行,解释它然后尝试用execve执行命令。如果'&',我也会把这个行为分给一个孩子。在输入中。
现在我希望隐藏来自execve命令的任何终端输出,当它在子进程中运行时。 有没有相对简单的方法来做到这一点?
答案 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;
}