popen : 명령어 수행 (파이프 생성)

<원형>

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

     int pclose(FILE *strm);


<인자>

     comstring : 수행할 명령어

     type : 부모와의 통신형태

     strm : 폐쇄할 파일 스트림

<리턴값>

     성공 : 열린 파일 스트림 포인터

     실패 : NULL

<함수 설명>

     popen() 도 system() 함수처럼 지정한 명령어를 수행한다. 그러나 호출 프로세스와 명령어 사이에 통신을 할 수 있는 파이프를 생성한다는 점이 system() 함수와 다르다. popen()을 호출하면 지정한 명령어를 수행하기 위해 fork()와 execl()을 수행한 후 파일 스트림을 반환하고 사용자는 그 반환된 파일 스트림을 이용해 표준 출력이나 표준 입력을 처리할 수 있다.그리고 어느 것을 지정할 지는 type 로 정한다.

     fp = popen("ls -l *","r");

     popen() 은 "ls -l *"명령어를 수행한다. system()함수는 이것을 화면에 뿌리지만 "r"을 이용하면 표준 출력되는 문자열을 다음과 같이 fp포인터를 이용해 읽을 수 있다.

          fgets(buff, buffsize, fp);

     또한 이와 반대로 표준 출력에 쓸 수도 있는데 이때 주의할 것은 popen()은 항상 pclose()로 닫아야 한다.

  1. BlogIcon jiyoun 2017.05.08 07:27 신고

    안녕하세요.
    popen에 대해서 study중인데 궁금한게 있어서요.
    popen호출 시 내부동작은 fork()와 execl()가 호출되어 동작하는데, execl() 실행에서 /bin/sh 즉, 쉘을 실행하여 와일드카드 확장을 이용할 수 있다고 들었습니다.
    이때 쉘을 이용하면 쉘에 대한 process는 fork된 process와 다른 process가 되는건가요?

    • Favicon of http://finsternis.tistory.com BlogIcon leanu 2017.05.11 10:16 신고

      어떤 내용의 질문인지 파악이 잘 안되네요 ㅜ.ㅜ

      혹시 어떤 작업을 하시길 원하시기에 popen에 대한 문의를 하셨는지 배경 설명을 해주시면 답변을 드릴 수 있을것 같습니다 :)

+ Recent posts