POPEN(3)

이름
popen, pclose - 프로세스 I/O

사용법
#include <stdio.h>

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

int pclose(FILE *stream);

설명
popen() 함수는 pipe, fork에 의해 생성된 프로세스를 열고 shell을 기동한다. pipe는 단 방향으로 정의되었기 때문에, type 인자는 읽기-쓰기가 아니라 둘중 하나만 지정한다.; 결과 스트림은 읽기-전용이거나 쓰기-전용이다.

command 인자는 shell 명령어 라인이 포함하는 null로 종료된 문자열에 대한 포인터이다. 이 명령어는 -c 플래그를 사용하여 /bin/sh 에 전달된다.; 만일 인자가 있다면, 해석은 shell에 의해 행해진다. mode 인자는 읽기를 위한 'r'이나 쓰기를 위한 'w'중 하나인 null로 종료된 문자열에 대한 포인터이다.

popen() 에서 반환 값은 fclose()보다 pclose() 로 종료되어야 하는 보통 표준 I/O 스트림이다. 그런 스트림에 쓰는것은 명령어의 표준 입력에 쓰는것과 같다;명령어의 표준 출력은 만일 이것이 명령어 자체에 의해 수정되지 않았다면 popen()이 호출하는 프로세스의 것과 같다. 대조적으로, ``popened'' 스트림에서 읽기는 명령어의 표준 출력을 읽고, 명령어 표준 입력은 popen을 호출한 프로세스의 것과 같다.

popen 스트림은 기본적으로 완전 버퍼된다는 점에 주의해라.

pclose 함수는 종료되는 관련 프로세스를 기다리며 wait4가 반환하는 것처럼 명령어의 종료 상태를 반환한다.

반환값
popen 함수는 만일 fork(2) 나 pipe(2) 호출이 실패하거나 메모리를 할당할수 없다면, NULL 을 반환한다.

pclose 함수는 만일 wait4 가 에러를 반환하거나 몇몇 다른 에러가 발견되면 -1을 리턴한다.

에러
popen 함수는 만일 메모리 할당이 실패한다면, errno 를 설정하지 않는다. fork() 나 pipe() 에서 실패한다면, errno 는 적당히 설정된다. 만일 mode 인자가 무효하고, 이 조건이 발견된다면, errno 는 EINVAL로 설정된다.

만일 pclose() 가 자식 상태를 얻을수 없다면, errno 는 ECHILD로 설정된다.

호환
POSIX.2

버그
읽기 위해 열려진 명령어의 표준 입력은 popen()을 호출하는 프로세스가 가지고 있는 offset을 공유하기 때문에, 만일 원래 프로세스가 버퍼된 읽기를 한다면, 명령어의 입력 위치는 예상될수 없다. 비슷하게 쓰기 위해 열려진 명령어에서의 출력은 원래 프로세스의 것과 섞일수 있다. 뒤의 문제는 popen전에 fflush(3)를 호출하여 피할수 있다.

shell 실행시 실패는 명령어 실행의 shell실패나 명령어의 종료와 구별되어야 한다. 유일한 힌트는 127 exit 상태이다.

역사
popen() 와 pclose() 함수는 Version 7 AT&T UNIX에서 나타났다.

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

역자
정강훈 <skyeyes@soback.kornet.net>, 2001년 4월 9일