C/C++에서 system() 함수는 표준 라이브러리에 포함된 강력한 도구로, 운영체제의 명령 프롬프트(터미널)에 직접 명령어를 전달해 실행할 수 있게 해줍니다. 이 글에서는 system() 함수의 기본 개념과 문법, 그리고 다양한 실전 예제를 통해 활용 방법을 자세히 알아보겠습니다.
system() 함수란?
system() 함수는 C/C++ 표준 라이브러리의 일부로, 운영체제의 명령 처리기(command processor) 또는 터미널에서 실행할 수 있는 명령어를 전달하는 데 사용됩니다. 전달된 명령의 실행이 완료되면 그 결과를 반환합니다.
이 함수를 호출하려면 <stdlib.h>(C) 또는 <cstdlib>(C++) 헤더 파일을 소스 코드에 반드시 포함해야 합니다.
문법(Syntax)
함수의 기본 문법은 다음과 같습니다.
int system(char command)
명령이 오류 없이 정상적으로 실행되면 이 함수는 0을 반환합니다.
예제 1: 현재 날짜 출력하기
입력: system("date")
출력: The current date is: Fri 12/27/2019설명 – 위 예제는 system() 함수를 사용해 현재 날짜를 화면에 출력하는 방법을 보여줍니다. 출력 결과는 운영체제의 명령 처리기 내부에 표시되며, 이를 통해 system() 함수 하나만으로 터미널 명령이나 명령 프롬프트용 명령을 손쉽게 실행할 수 있음을 확인할 수 있습니다.
예제 2: 콘솔 텍스트 색상 변경하기
입력: system("color a")
출력:
위 예제는 실행할 명령어가 담긴 문자열을 system() 함수에 그대로 전달하는 간단한 방식을 보여줍니다. 여기서 사용한 "color a" 명령은 명령 프롬프트의 텍스트 색상을 변경하는 명령으로, 실제로 정상적으로 작동하는 것을 확인할 수 있습니다.
프로그램 작성 접근 방식
명령어를 변수에 담아 system() 함수로 전달하는 프로그램은 다음 순서로 작성할 수 있습니다.
- 먼저 char 타입의 배열 변수를 적절한 크기로 선언합니다(예: cmd[10]). 이 배열은 실행할 명령어를 저장하는 용도로 사용됩니다.
- strcpy() 함수를 사용해 앞서 선언한 배열에 원하는 명령어를 복사해 넣습니다. (strcpy() 함수를 사용하려면 <string.h> 헤더 파일을 반드시 포함해야 합니다.)
- 마지막으로 명령어가 저장된 문자열 배열을 system() 함수의 인자로 전달합니다.
알고리즘
시작
Step 1 -> main() 함수에서
char cmd[10] 선언
strcpy(cmd, "dir") 함수 호출
system(cmd) 함수 호출
종료
예제 코드
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main() {
char cmd[10];
strcpy(cmd, "dir");
system(cmd);
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
12/25/2019 10:04 AM <DIR> .
12/25/2019 06:33 AM <DIR> ..
12/24/2019 09:56 AM <DIR> bin
12/25/2019 10:04 AM 183 main.cpp
12/25/2019 10:04 AM 1,564,278 main.exe
12/25/2019 06:33 AM 1,046 main.o
12/24/2019 06:33 AM <DIR> obj
12/24/2019 06:33 AM 1,062 Test.cbp
12/24/2019 06:36 AM 358 Test.layout
5개 파일 1,566,927 바이트
4개 디렉터리 169,866,692,120 바이트 남음
이 예제에서는 system() 함수에 "dir" 명령을 입력으로 전달했기 때문에, 현재 작업 디렉터리에 존재하는 파일과 하위 폴더 목록이 그대로 출력됩니다.
명령 처리기 존재 여부 확인하기
운영체제에 명령 처리기가 존재하는지 확인해야 할 때는 다음 방법을 사용할 수 있습니다.
system() 함수에 널 포인터(NULL)를 인자로 전달하면 됩니다. 이때 반환값이 0이 아니라면 명령 처리기가 시스템에 존재한다는 의미입니다.
반대로 반환값이 0이라면 명령 처리기가 존재하지 않아 system() 함수를 호출할 수 없다는 뜻입니다.
예제 코드
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
if(system(NULL))
cout << "Command Processor is present";
else
cout << "Command processor is not present";
return 0;
}
마치며: system() 함수 사용 시 주의 사항
system() 함수는 터미널 명령을 손쉽게 실행할 수 있는 매우 편리한 기능이지만, 몇 가지 주의할 점이 있습니다. 외부에서 입력받은 문자열을 검증 없이 그대로 system()에 전달하면 명령 삽입(command injection) 공격 등 보안 취약점이 발생할 수 있습니다. 또한 반환값의 의미는 운영체제와 컴파일 환경에 따라 달라질 수 있으므로, 이식성이 중요한 코드에서는 반환값 해석에 유의해야 합니다.