[C] Linux 의 쉘명령 출력을 변수로 받기

리눅스에서 C 프로그램을 하다보면 프로그램을 쉽게 하기 위해 기존의 쉘명령 을 종종 이용합니다.
새로 만들지 않고도 얼마든지 기존의 검증된 명령을 사용하여 조합만으로 개발이 가능하기 때문이죠

자 그럼 쉘명령을 내리고 그 결과 값을 Char 배열에 받는 방법을 알아보도록 하겠습니다.

방법은 여러가지가 있습니다.

출력을 파일로 만들고 그 파일을 읽어 들이는 방법이 있습니다.

char buffer[512];
System("ls > ls_result.txt");
fd = fopen("ls_result.txt", "r");
.
.
.
int num = fread( buffer, sizeof( char ), 512, fd);
fclose(fd);

위처럼 출력문을 파일로 저장하고 그 파일을 읽을 수 있습니다. 출력문을 저장하고 그파일을 다시 읽고 이것도 참 로드가 많이 걸리고 귀찮은 작업입니다.

다음에 소개드리는 작업을 쉽고 빠르게 프로그래밍 할 수 있습니다.

일단 핵심 부터 알아보겠습니다.

파이프

파이프라는 기능을 설명드리면  프로그램에서 표준 출력 장치로 출력한 내용을 다른 프로그램의 입력으로 전송할 수 있는 기능입니다.

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

popen() 함수

  • 헤더: stdio.h
  • 형태: FILE *popen(const char *command, const char *type)
  • 인수: char *command : 실행할 명령어
    char *type : 엑세스모드
  • 반환: NULL != 파일 포인터, NULL == 실패
엑세스 모드 Description
r호출 프로세스가 반환된 스트림을 사용하여 생성된 명령의 표준 출력을 읽을 수 있습니다.
w호출 프로세스가 반환된 스트림을 사용하여 생성된 명령의 표준 입력에 쓸 수 있습니다.
b이진 모드에서 엽니다.
t텍스트 모드에서 엽니다.

예제 소스

#include <stdio.h>

int run_shell_command(char *command, char *output, int *out_len)
{
    int result;
    if (!command) return -1;

    result = -1;

    if (output)
    {
        FILE* file;
        file = popen(command, "r");

        if (file)
        {
            *out_len = fread(output, 1, *out_len - 1, file);
            if (*out_len >= 0)
                output[*out_len] = 0;
            else
                output[0] = 0;
            result = pclose(file);
        }
    }
    else
    {
        result = System(command);
    }

    return result;

}

int main()
{
    char output[512];
    int length = 512;
    run_shell_command("ls" , output, &length);
    
    printf("%s", output);
}

위와 같은 예제로 run_shell_command 라는 함수를 만들어 쉽게 출력문을 문자열에 할당 할 수 있는 방법을 소개드렸습니다.

Leave a Comment