2014-10-19 3 views
2

나는 기본적으로 사용자로부터 라인을 읽어서 해석하고 execve로 명령을 실행하려고하는 C 프로그램을 만들고 있습니다. 또한 '&'이 입력되면 execve를 하위 프로세스로 분기합니다.Execve에서 터미널 출력 숨기기

이제 자식 프로세스에서 execve 명령을 실행할 때 터미널 출력을 숨기려고합니다. 이 작업을 수행하는 비교적 쉬운 방법이 있습니까?

답변

2

당신은 분기 이후하지만 execve() 전에는/dev/null로 표준 출력 및 표준 오류 리디렉션하여 출력을 숨길 수 있습니다. 아이디어는/dev/null을 열고, 얻어진 파일 기술자의 stdout과 stderr duplicate를 dup2() (원본을 먼저 닫음)으로 만든다. 파이프로 리디렉션하는 것과 거의 같습니다.

예 (불완전 프로그램 및 생략 대부분의 오류 검사) :

... 

    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

+0

이것은 작동하지 않아야합니다 (나를위한 것이 아닙니다). 사용하려고하는 IO 리다이렉션은 쉘에 의해 처리되지만,'execve'는 쉘을 사용하여 명령을 실행하지 않습니다. 그것은'execve'가 실패 할 때'/ bin/ls'을 전혀 실행하지 않기 때문에 작동하는 것처럼 보입니다. – Dmitri