흠~ 매우 간단한 방법이 있는데 어렵게 생각하는 경우가 많네요. 그중 하나가 프로그램을 실행하고 화면에 출력되는 문자열을 어떻게 가져 오느냐 하는 것입니다. 화면도 파일 디스크립터로 열 수 있으니 프로그램을 실행 시켜 놓고 계속 화면을 읽으면 되지 않겠냐고 하는데, 저도 이렇게 작성해 본적은 없지만, 안 되지는 않겠죠.

 

그러나 프로그램의 실행 시작부터 알아야 하고 이후로 출력되는 문자열이 그 프로그램이 출력하는 것인지, 다른 애플리케이션의 문자열인지 구별해서 받기란 쉽지 않습니다. 무엇보다도 프로그램이 출력하는 문자열이 매우 빠르게 출력되어 역시 빠르게 스크롤된다면 잃어 버리는 데이터도 많겠지요.

 

그러나 이렇게 두 개의 프로그램으로 나누어 화면을 읽는 애플리케이션을 따로 만들 필요가 없습니다. popen() 함수를 이용하면 화면 출력이 빠르고 내용이 많다고 하더라도 잃어 버리지도 않지요.

 

popen() 함수를 open()이나 fopen()과 비교해 보면 open()과 fopen()은 이미 만들어진 파일의 내용을 순차적으로 읽기를 한다면

 

popen()은 프로세스를 실행하고 종료할 때까지 화면에 출력되는 내용을 마치 파일에서 파일 애뇽을 읽어 오는 것처럼 실행합니다.

예를 들어 eth0의 정보에서 IP를 읽어 와야 한다면 ifconfig를 실행하고 화면에 출력되는 IP 정보를 읽는 것이 제일 정확하지요. 그렇다면 아래 코드처럼 popen()을 이용해 보세요.

int main( int argc, char *argv){

    FILE    *fp;
    char     buff[1024];

    fp = popen( "ifconfig", "r");
    if ( NULL == fp){
        return -1;
    }
    while( fgets( buff, sizeof( buff), fp) ){                   // A-HOC 등록 결과를 확인
        printf( "---%s", buff);
    }
    pclose( fp);

    return 0;
}

컴파일하고 실행하면 아래와 화면에 출력합니다. ifconfig가 실행돼서 출력되는 문자열은 화면에 출력되지 않습니다. 대신에 데스트 프로그램이 읽어화서 화면에 뿌리죠

]$ ./a.out
---eth0      Link encap:Ethernet  HWaddr 00:FA:01:A2:13:04  
---          inet addr:192.168.2.78  Bcast:192.168.255.255  Mask:255.255.0.0
---          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
---          RX packets:24950 errors:0 dropped:0 overruns:0 frame:0
---          TX packets:226 errors:0 dropped:0 overruns:0 carrier:0
---          collisions:0 txqueuelen:1000 
---          RX bytes:2096203 (1.9 MiB)  TX bytes:38906 (37.9 KiB)
---          Interrupt:42 
---
---lo        Link encap:Local Loopback  
---          inet addr:127.0.0.1  Mask:255.0.0.0
---          UP LOOPBACK RUNNING  MTU:16436  Metric:1
---          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
---          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
---          collisions:0 txqueuelen:0 
---          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
---