2013-12-07 2 views
0

안녕하세요, 저는 C로 쉘을 만들려고합니다. 그리고 i/o 리다이렉션 부분에 붙어 있습니다. "333sh : myprog < in_file> out_file"과 같은 여러 리디렉션을 지원해야합니다. myprog는 in_file에서 입력을 가져오고 결과는 out_file로 리디렉션되는 식으로 진행됩니다. 나에게 출발점을 줄 수 있니? 감사합니다쉘 입출력 리다이렉션

답변

0

printf와 scanf (또는 stdin/stdout에서 작동하는 다른 함수)가있는 곳이면 파일 이름 (fprintf/fscanf)에 대한 인수를받는 함수로 바꾸고 그 인수에서 io 리디렉션 파일을 열어.

1

쓰고있는 쉘은 myprog 프로세스를 실행하고 어떤 식 으로든 입력을 in_file에서 읽고 강제로 out_file에 출력해야합니다.

가장 먼저 할 일은 입력을 분석하는 것입니다. 이것이 의미하는 바는 프로그램 내부에서 시작하려는 프로세스의 이름,에서 읽을 파일 이름 및 쓸 파일 이름을 나타냅니다. 이 작업을 수행하려면 기본적으로 문자열 myprog <in_file> out_file을 토큰 화 한 다음 수행 할 작업에 대한 구조체와 같은 표현이 필요합니다.

리디렉션을 실제로 수행하는 방법은 매우 쉽습니다. 과정을 시작하려면 fork()으로 가고 나서 execvp으로 갈 것 같습니다. 파일 디스크립터가 포크에 복사되고 execvps에 걸쳐 유지된다는 사실을 깨닫게됩니다.

그래서 기본적으로 쉘, 당신은 input_file의 파일 기술자 STDIN_FILENO을 교체하고 output_file의 파일 기술자 STDOUT_FILENO을 대체 할 dup(2) 전화를 사용합니다. 그런 다음 fork하고 execvp하십시오. 포크 후 부모 프로세스 (셸)에서 STDOUT 및 STDIN 파일 설명자를 포크 이전의 상태로 복원하려는 경우 어떤 방식 으로든 해당 정보를 기억하고 싶을 것입니다.

+0

+1하지만 영업 담당자가 해당 파일을 열어야한다고 말할 수 있습니다. – Duck