POPEN(3)

명칭
popen, pclose - 입출력 처리

프로그램 라이브러리
libc

서식
<stdio.h> FILE * popen(const char *command, const char *type) int pclose(FILE *stream)

해설
popen() 함수는, 쌍방향 파이프 포크를 작성해, 쉘을 기동해 프로세스를 “열림” parent process로 사전에 popen() (을)를 호출해 열린 스트림은, 새로운 child process에 의해 클로우즈 됩니다. 이전의 popen() (은)는 단방향의 파이프로 실장되고 있었기 때문에, popen() (이)가 많은 실장은, 읽고 쓰기의 양쪽 모두가 아니고, type 인수가 독입 혹은 쓰기의 어느 쪽인지를 지정하는 것 만 허가하고 있었습니다. 현재의 popen() (은)는 쌍방향 파이프로 실장하고 있으므로, type 인수로 쌍방향 데이터 플로우(flow)를 요구할 수 있습니다. type 인수는 눌 캐릭터로 끝나는 캐릭터 라인의 포인터로, 읽기의 경우는 ‘r’ , 기록의 경우는 ‘w’ , 읽고 쓰기의 경우는 ‘r+’ 일 필요가 있습니다.

command 인수는, 쉘 명령행을 포함한, 눌 캐릭터로 종료하는 캐릭터 라인의 포인터입니다. 이 명령은, -c 플래그로 /bin/sh 에게 건네집니다. 해석이 있는 경우, 쉘로 실행됩니다.

popen() 의 반환값은 통상의 표준 입출력 (와)과 모든 점으로 동등의 것입니다. 다만, 닫을 때는, fclose() (은)는 아니고 pclose() (을)를 사용하지 않으면 안됩니다. 이러한 스트림에 쓰기와 명령의 표준 입력에 쓰기. 명령의 표준 출력은, 그 명령 자체로 변경하지 않는 한, popen() 그리고 호출한 프로세스의 것과 같습니다. 반대로, popen() 그리고 “열렸다” 스트림로부터의 독포함은, 명령의 표준 출력으로부터 독 붐비어집니다. 명령의 표준 입력은 popen() (을)를 호출한 프로세스의 것과 같습니다.

출력 popen() 스트림은, 디폴트로 완전하게 버퍼 되는 것에 주의해 주세요.

pclose() 함수는, 연결시킬 수 있었던 프로세스의 종료를 대기해, wait4() 하지만 되돌리는 명령의 종료 스테이터스를 돌려줍니다.

반환값
popen() 함수는, fork(2) 인가 pipe(2) 그리고 에러가 발생했을 경우, 또는 메모리를 할당할 수 없는 경우는 눌 (을)를 되돌립니다.

pclose() 함수는, 스트림 하지만 popen() 그리고 “열었다” 명령와 결부되지 않았던 경우, 또는 스트림 하지만 벌써 pclose() 그리고 “닫고 있다” 경우, 혹은 wait4 그리고 에러가 발생했을 경우는 -1 을 되돌립니다.

에러
popen() 함수는, 신뢰성이 있다 errno (을)를 설정하지 않습니다.

관련 항목
sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)

버그
읽기용으로 열린 명령의 표준 입력은, popen() (을)를 호출한 프로세스와 시크 오프셋(offset)를 공유하므로, 오리지날 프로세스가 버퍼 읽기를 실행하면(자), 명령의 입력 위치가 예상대로 안 되는 것이 있습니다. 같이 기록용으로 열린 명령의 출력은, 오리지날 프로세스의 것과 섞이는 일이 있습니다. 후자는, popen() 의 전에 fflush(3) (을)를 호출하는 것으로 회피할 수 있습니다.

쉘을 실행하지 않는 것에는, 그것을 실행할 수 없는 명령의 쉘 인가, 곧바로 종료해 버리는 명령인가, 구별할 수 없습니다. 종료 스테이터스의 127 만이 힌트가 됩니다.

popen() 의 인수는 항상 sh(1) (을)를 호출해, csh(1) (은)는 호출하지 않습니다.

역사
popen() 함수와 pclose() 함수는, AT&T UNIX 그리고 등장했습니다.

쌍방향 기능은, FreeBSD 2.2.6 그리고 추가되었습니다.