2014-04-18 3 views
0

C로 자체 셸을 작성하고 있습니다. 매우 간단하지만 세 가지 명령을 추가로 구현하고 싶습니다. 첫 번째는 인수가 있거나없는 명령으로 출력이 파일로 리디렉션됩니다. 두 번째는 인수가 있거나없는 명령으로 파일에 출력이 추가됩니다. 마지막으로 인수가 있거나없는 명령으로 파일에서 입력이 리디렉션됩니다.사용자 지정 셸에서 입력/출력 파일 리디렉션을위한 명령 쓰기

이러한 명령은 모두 시스템 호출 freopen(), dup()dup2()을 사용하여 구현할 수 있습니다.

첫 번째 명령의 예는 ls -l > fileName.txt 일 수 있습니다. 이 명령의 출력을 받아서 fileName.txt에 넣어야합니다.

두 번째 명령의 예는 ls -l >> fileName.txt 일 수 있습니다. 이 명령의 출력을 받아야 파일 fileName.txt에있는 모든 항목에 추가해야합니다.

마지막 명령의 예는 bc < file 일 수 있습니다. 이것은 명령의 출력을 가져 와서 명명 된 파일에 넣습니다.

이것은 구현하기가 너무 어렵지는 않지만 어떤 이유로 나는 그것을 수행하는 방법을 모르고 심각한 문제가 있습니다. 누군가 나를 도울 수 있었습니까?

+0

"<" ">"은 실행 파일의 stdin 표준 출력을 리디렉션합니다. filename에 대한 인수를 구문 분석하고, 표준 입력/표준 출력을 파일에서 /로 리디렉션하십시오. 당신은 심판을 사용할 수 있습니다 http://stackoverflow.com/questions/584868/rerouting-stdin-and-stdout-from-c..also >> 첨부 파일을 열 수 있습니다 (모드에서 +) ref http를 엽니 다 : //man7.org/linux/manage-man3/fopen.3.html –

답변

1

원시 시스템 호출을 사용합니다. freopen()을 무시하고 open()을 사용하십시오. stdio 루틴은 FILE* 스트림에서 작동하며 syscalls는 정수 파일 설명자와 함께 작동합니다. 두 가지를 섞으면 심각한 문제가 발생합니다. (4)에서는

  • dup(fd) FD이었다 표준 출력을 위해, 표준 입력에 0, 1을 리디렉션하는 fd
  • close() 파일을 반환에/리디렉션

    • open() 파일을 단계에 ;-)

      리디렉션 간다 첫 번째 단계에서 open()에 의해 반환 됨

    • close(fd) 당신은 그것을 필요 없어 enymore

    트릭은 dup()이 새로운 파일 설명자에 대해 사용 가능한 가장 낮은 정수를 반환한다는 것입니다. stdout을 방금 닫은 경우 11을 반환하고 갑자기 stdout이 이전에 열었던 파일을 가리 킵니다.

  • +0

    ''dup' 대신에'dup2'를 제안 할 것입니다. 왜냐하면 여러분이 원 자성 연산에서 원하는 것을 정확히 수행하기 때문입니다. – Flexo

    +0

    예. 그러나이 프로젝트는 분명히 학습에 관한 것이므로 실제로 두 가지를 시도해 보는 것이 좋습니다. :-) – SzG

    관련 문제