본문 바로가기

개발/Linux

파이프 - 프로세스 파이프, popen/pclose

반응형
파이프란 무엇인가?

- 파이프는 두 프로세스 사이의 자료 흐름 통로를 제공하는 수단이다. 일반적으로 파이프는 한 프로세스의 출력을 다른 프로세스의 입력에 연결하는 용도로 쓰인다. 

- 셸에서는 | 기호를 이용하여 명령을 넣는 것으로 파이프를 사용한다. 


프로세스 파이프

#include <stdio.h>

FILE *popen(const char *command, const char *open_mode);

- popen_mode가 "r"인 경우 호출한 프로그램은 fread 같은 통상적인 stdio 라이브러리 함수들을 이용해서 popen이 반환한 파일 스트림 FILE*을 읽음으로써 호출된 프로그램의 표준 출력을 읽을 수 있다.

- popen_mode가 "w"인 경우 호출한 프로그램은 fwrite로 popen이 반환한 파일 스트림에 자료를 기록함으로써 호출된 프로그램에게 자료를 보낼 수 있다. 

- 그러므로 popen으로는 양방향 입출력이 불가능하다는 뜻이다. 호출 실패시에는 널포인터를 돌려준다. 

- 양방향을 위해서는 입력 출력을 각각의 파이프를 이용하여 사용하는 것이다.


#include <stdio.h>

int pclose(FILE *stream_to_close);

- popen으로 생성한 파일스트림을 닫는것. popen으로 띄운 프로세스가 완료되어야 반환된다. pclose를 호출한 시점에서 해당 프로세스가 아직 실행 중이라면 그 호출은 해당 프로세스가 종료될 때까지 차단된다. 

- pclose를 호출하기 전에 wait를 호출했다면 해당 프로세스의 종료 상태가 사라진 후이므로 pclose는 -1을 돌려준다. 이경우 errno에는 ECHILD가 설정된다. 

- popen1.c


- popen2.c



- popen3.c




-popen호출은 command 문자열을 인수로 해서 셸을 실행함으로써 요청된 명령을 실행한다. 
복잡한 셸 명령을 popen으로 수행할 수 있는 장점이 있으나, execl같은 다른 프로세스 생성함수들에서는 명령 인수들을 직접 처리해 주어야 하기 때문에 같은 효과를 얻기가 휠씬 힘들고, 셸을 거치기 때문에 popen 호출마다 두개의 추가적인 프로세스가 만들어져야 하므로, 시스템 자원이 낭비될 뿐만 아니라 해당 명령을 직접 호출할 때보다 속도도 느리다. 


반응형

'개발 > Linux' 카테고리의 다른 글

커널 관리  (0) 2015.02.11
커널 모듈  (0) 2015.02.11
프로세스와 신호 - 안정적인 신호 인터페이스  (0) 2014.11.07
프로세스와 신호 - 신호 보내기  (0) 2014.11.07
프로세스와 신호 - 신호  (0) 2014.11.07