나는 기본적으로 사용자로부터 라인을 읽어서 해석하고 execve로 명령을 실행하려고하는 C 프로그램을 만들고 있습니다. 또한 '&'이 입력되면 execve를 하위 프로세스로 분기합니다.Execve에서 터미널 출력 숨기기
이제 자식 프로세스에서 execve 명령을 실행할 때 터미널 출력을 숨기려고합니다. 이 작업을 수행하는 비교적 쉬운 방법이 있습니까?
나는 기본적으로 사용자로부터 라인을 읽어서 해석하고 execve로 명령을 실행하려고하는 C 프로그램을 만들고 있습니다. 또한 '&'이 입력되면 execve를 하위 프로세스로 분기합니다.Execve에서 터미널 출력 숨기기
이제 자식 프로세스에서 execve 명령을 실행할 때 터미널 출력을 숨기려고합니다. 이 작업을 수행하는 비교적 쉬운 방법이 있습니까?
당신은 분기 이후하지만 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 */
...
간단한 예제를 작성했습니다. 아마도 도움이 될 것입니다.
먼저 | 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
이것은 작동하지 않아야합니다 (나를위한 것이 아닙니다). 사용하려고하는 IO 리다이렉션은 쉘에 의해 처리되지만,'execve'는 쉘을 사용하여 명령을 실행하지 않습니다. 그것은'execve'가 실패 할 때'/ bin/ls'을 전혀 실행하지 않기 때문에 작동하는 것처럼 보입니다. – Dmitri