C언어 파이프 생성 함수 popen()

2020. 3. 16. 07:58 컴퓨터/프로그래밍

C함수 파이프 생성 popen()

popen() 함수는 파이프 기능을 이용하여 다른 프로그램의 실행 결과를 읽어 들이거나, 다른 프로그램의 표준 입력 장치로 출력할 수 있습니다.

  • 헤더: stdio.h
  • 형태: FILE *popen(const char *command, const char *type)
  • 인수: char *command 실행할 명령어
    char *type 통신 형태
  • 반환: NULL != 파일 포인터, NULL == 실패

유닉스에서는 프로그램에서 표준 출력 장치로 출력한 내용을 다른 프로그램의 입력으로 전송할 수 있습니다. 이를 파이프라고 하는데, 예로 파일 목록 중에 ff 문자가 있는 파일을 검색한다면 아래와 같이 실행할 것입니다.

]$ ls -al | grep ff

유닉스에서는 작은 것이 아름답다라는 말이 있을 정도로 하나의 프로그램에서 모든 기능을 담아 크게 만들기 보다는 자기 기능에만 충실하게 만들고 다른 필요한 기능은 파이프를 이용하여 출력 결과를 서로 주고 받으면서 마치 하나의 프로그램처럼 실행합니다.

popen() 함수는 이런 파이프 기능을 이용하여 다른 프로그램의 실행 결과를 읽어 들이거나, 다른 프로그램의 표준 입력 장치로 출력할 수 있습니다. 특히 다른 프로그램을 실행하고 그 실행 결과를 읽어 들일 때 이용하면 매우 편리합니다.

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

command 는 쉘에서 실행하는 명령과 같은 문자열입니다. type 은 아래의 두가지 상수를 사용할 수 있으며, 출력 방향을 결정합니다.


type 의미
'r' 파이프를 통해 입력 받습니다.
'w' 파이프를 통해 출력합니다.

예제

예제에서는 route 명령을 실행하여 그 결과를 화면에 출력합니다. 예제 내용은 간단합니다만 읽어 들인 문자열을 가공한다면 게이트웨이 정보를 구할 수 있습니다.

#include <stdio.h>

#define  BUFF_SIZE   1024

int main( void)
{
   char  buff[BUFF_SIZE];
   FILE *fp;

   fp = popen( "route", "r");
   if ( NULL == fp){
      perror( "popen() 실패");
      return -1;
   }
   while( fgets( buff, BUFF_SIZE, fp) )
      printf( "%s", buff);

   pclose( fp);

   return 0;
}

실행 결과

]$ ./a.out
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    *               255.255.255.0   U     0      0        0 eth0
default         192.168.10.1    0.0.0.0         UG    0      0        0 eth0
]$
이 댓글을 비밀 댓글로