2011-02-03 1 views
3

간단한 쉘 프로그램을 작성하려고하지만 비 내장 명령에 대한 파일 리디렉션 문제가 있습니다. 예를 들어 ./a.out < infile> outfile을 사용하면 사용자가 infile에서 입력을 가져 와서 평소 사용하는 스트림 대신 출력을 outfile으로 출력하는 프로그램을 작성하게됩니다. 기본 제공되지 않은 명령을 발견하면 새 프로세스를 포크하고 제공된 인수로 새 이미지를 오버레이합니다. 일반적인 형식은 다음과 같습니다. arg1 arg2 ... argn < infile> outfile. args (arg1 ~ argn)는 새 이미지에서 전달되고 입력 및 출력은 infile 및 outfile로 변경됩니다. 다음은 내 포크 프로세스의 모양입니다.기본 제공되지 않는 명령에 대한 단순한 쉘 프로그램 유닉스 파일 리디렉션

pid = fork(); 

if (pid < 0) { 
    fprintf(stderr, "*** fork error ***\n"); 
} else if (pid == 0) { 
    execvp(command, args); 
} 

waitpid(pid, &status, 0); 

이렇게 할 수있는 유닉스 명령이 있습니까? 나는 또한 새로운 이미지에서 stdin과 stdout을 바꿀 수있는 방법이있을 것이라고 생각하고 있었다. 모든 링크 또는 정보를 주시면 감사하겠습니다.

+0

"fork 오류"는 유용한 메시지가 아닙니다. perror()를 사용하십시오. –

답변

2

유닉스에서 일반적으로 dup2이 필요합니다. 파일 설명자 복제에 대해서는 libc docs을 참조하십시오.

2

exec- 직전의 분기 된 프로세스에서 닫기 파일은 0 (표준 입력), 1 (표준 출력) 및 2 (표준)를 처리합니다.

그런 다음 open()을 사용하여 올바른 순서 (stdin, out 및 err)로 필요한 파일을 엽니 다. 그들은 각각 파일 핸들 테이블의 첫 번째 항목을 사용합니다 (0, 1 및 2). 따라서 첫 번째 파일은 stdin으로 처리됩니다.

관련 문제