2013-01-23 2 views
0

결국 동시성을 활용할 셸을 작성하려고합니다. 지금 당장 필자는 쉘 파서를 사용하고 있지만 명령을 실행하는 방법을 알아 내려는 데 어려움을 겪고 있습니다. 나는 exec (execvp 등)에서 조금 보았는데 유망 해 보이지만 몇 가지 질문이 있습니다.셸 쓰기 - 명령 실행 방법

exec가 파일 입출력 방향 재 지정을 처리 할 수 ​​있습니까? exec를 사용하여 파이프를 설정할 수 있습니까?

하위 쉘에 대해서도 궁금합니다. 서브 셸이 반환해야하는 것은 무엇입니까? 마지막 문장의 종료 상태? 서브 쉘이 파이프의 일부가 될 수 있습니까?

이들은 정말 바보 같은 질문처럼 보일 수 있지만 제 경험이 부족한 분은 참고하시기 바랍니다.

+0

이런 종류의 기본적인 유닉스 프로그래밍 문제에 대한 참고 서적으로 저는 [Michael Kerrisk의 * The Linux Programming Interface *] (http://man7.org/tlpi/)를 권장합니다. 사실 24.2.1 절과 27.4 절 (517-520, 575-578 페이지) 표준 I/O 리디렉션에 대한 질문에 대답합니다. –

답변

1

exec가 파일 입출력 방향 재 지정을 처리 할 수 ​​있습니까?

아니, 당신은 것을 open()dup() 또는 dup2() (및 close())와 해.

exec를 사용하여 파이프를 설정할 수 있습니까?

아니, 당신이 할 그 pipe(), dup() 또는 dup2()close() 통화의 많은.

하위 쉘에 대해서도 궁금합니다. 서브 쉘은 무엇을 리턴해야합니까? 마지막 명령문의 종료 상태는 무엇입니까?

정상적인 협약입니다. 그렇습니다.

서브 쉘은 파이프의 일부일 수 있습니까?

예. 당신이 무서워 얻고 싶은 경우에, 당신은 posix_spawn() 및 지원 기능을 조사 할 수

(cd /some/where; find . -name '*.png') | sed 's/xyz/prq/' > mapped.namelist 

: 일반 쉘, 당신은 뭔가를 쓸 수 있습니다. POSIX 2008 사이트에서 '스폰'를 검색하고 두려워 할 준비를하십시오. posix_spawn() 및 그 지지자를 사용하여 코드 작업보다 맵핑 작업을 임시로 수행하는 것이 실제로 더 쉽다고 생각합니다.

+0

왜 C hahah에서 같은 일을하는 많은 방법이있는 것처럼 보입니까? 서브 쉘이 파이프의 오른쪽에 나타나면, 왼쪽의 명령 출력이 서브 쉘의 첫 번째 명령 입력이된다는 의미입니까? 그냥 맹목적인 추측을하십시오. – user1174472

+0

아, 그리고 웬일인지 이걸 할 수 있어요 ..'ls> file | cat'과 출력이 없습니다. 그게 무슨 뜻인지조차 모르겠다. 문법 오류가 예상된다. 바보 같은 질문들로 너를 괴롭히지 않아서 미안해. 내가 어디에서 hahah에게 물어야할지 모르겠다. – user1174472

+0

'ls'는 출력을'file'에 보냅니다. 'cat'이 쓰는 파이프에는 아무 것도 나타나지 않습니다. –

1

쉘의 표준 기술은 fork-exec입니다. 이 모델에서 응용 프로그램을 실행하기 위해 쉘은 fork을 사용하여 자신의 복사본 인 새 프로세스를 만든 다음 exec 변종 중 하나를 사용하여 자체 코드, 데이터 등을 실행 파일로 지정된 정보로 대체합니다 디스크에.

이 모델에 대한 좋은 점은 주소 공간을 변경하기 전에 쉘이 파일 설명 자 (exec로 버려지 지 않음)로 약간의 추가 작업을 수행 할 수 있다는 것입니다. 따라서 리다이렉션을 구현하기 위해 파일 설명자 0, 1 및 2 (각각 stdin, stdout 및 stderr)가 콘솔 I/O 대신 다른 열린 파일을 가리 키도록 변경합니다. dup2을 사용하여 이러한 파일 설명자 중 하나의 의미를 변경 한 다음 exec를 실행하여 새 프로세스를 시작하십시오.