我正在製作一個C程序,它基本上讀取用戶的一行內容,解釋它,然後嘗試使用execve執行該命令。如果'&'在輸入中,我還會將execve分配給子進程。從Execve隱藏終端輸出
現在我希望隱藏任何來自execve命令的子進程中運行的終端輸出。 有沒有比較簡單的方法來做到這一點?
我正在製作一個C程序,它基本上讀取用戶的一行內容,解釋它,然後嘗試使用execve執行該命令。如果'&'在輸入中,我還會將execve分配給子進程。從Execve隱藏終端輸出
現在我希望隱藏任何來自execve命令的子進程中運行的終端輸出。 有沒有比較簡單的方法來做到這一點?
您可以隱藏通過派生之後,但之前execve()
重定向輸出和錯誤到/ 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 */
...
我寫了一個簡單的例子,也許它會幫助你。
首先,嘗試調用它沒有| 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;
}
會投你了,但我首先需要一個更高的排名!謝謝! – log234 2014-10-19 22:53:16
這不應該(但不適用於我)。它嘗試使用的IO重定向將由shell處理 - 但是'execve'不使用shell來運行命令。它似乎只是工作,因爲當'execve'失敗時,它根本不運行'/ bin/ls'。 – Dmitri 2014-10-20 00:31:52