2014-10-19 56 views
2

我正在製作一個C程序,它基本上讀取用戶的一行內容,解釋它,然後嘗試使用execve執行該命令。如果'&'在輸入中,我還會將execve分配給子進程。從Execve隱藏終端輸出

現在我希望隱藏任何來自execve命令的子進程中運行的終端輸出。 有沒有比較簡單的方法來做到這一點?

回答

2

您可以隱藏通過派生之後,但之前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 */ 

    ... 
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; 
} 
+0

會投你了,但我首先需要一個更高的排名!謝謝! – log234 2014-10-19 22:53:16

+0

這不應該(但不適用於我)。它嘗試使用的IO重定向將由shell處理 - 但是'execve'不使用shell來運行命令。它似乎只是工作,因爲當'execve'失敗時,它根本不運行'/ bin/ls'。 – Dmitri 2014-10-20 00:31:52