我正在编写一个C程序,它基本上从用户那里读取一行输入,然后解释该命令并尝试使用execve执行。如果输入中包含'&',我还会将execve分叉到子进程中。
现在我希望隐藏来自子进程中运行的execve命令的任何终端输出。 有相对简单的方法可以做到这一点吗?
#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 */
...
我写了一个简单的例子,也许可以帮到你。
首先,尝试在不加 | 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;
}
execve
不使用shell运行命令。它之所以似乎起作用,只是因为当execve
失败时,根本没有运行/bin/ls
。 - Dmitri