Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++의 system() 함수로 구현하는 놀라운 기능들

C나 C++에서 system() 함수를 활용하면 의외로 강력한 작업들을 수행할 수 있습니다. 이번 글에서는 system() 함수를 사용했을 때 얻을 수 있는 흥미로운 결과들을 살펴보겠습니다.

system() 함수는 Windows, Linux, macOS 등 주요 운영체제에서 모두 사용할 수 있으며, 명령 프롬프트(커맨드 라인)에서 실행 가능한 시스템 명령어를 C/C++ 코드 내에서 직접 호출하는 역할을 합니다.

여기서는 system() 함수의 두 가지 대표적인 활용 예시를 소개합니다. 첫 번째는 C++ 프로그램으로 IP 설정 정보를 조회하는 방법입니다.

예제 1: IP 설정 정보 가져오기

Windows 환경에서 네트워크 어댑터의 IP 주소, 서브넷 마스크, 기본 게이트웨이 등의 정보를 확인하려면 보통 명령 프롬프트에서 ipconfig 명령어를 입력해야 합니다. 하지만 아래와 같이 system() 함수에 해당 명령어 경로를 전달하면 C++ 프로그램 안에서 동일한 결과를 얻을 수 있습니다.

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    system("C:\\Windows\\System32\\ipconfig");
}

실행 결과

Windows IP Configuration
Ethernet adapter Local Area Connection:
    Connection-specific DNS Suffix . : domain.name
    Link-local IPv6 Address . . . . . : fe80::302b:9dff:1cfb:ff01%10
    IPv4 Address. . . . . . . . . . . : 192.168.2.6
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : fe80::217:7cff:fe3d:31c8%10
                                        192.168.2.1
Ethernet adapter VirtualBox Host-Only Network:
    Connection-specific DNS Suffix . :
    Link-local IPv6 Address . . . . . : fe80::5c79:a124:f5b9:e0b7%13
    Autoconfiguration IPv4 Address. . : 169.254.224.183
    Subnet Mask . . . . . . . . . . . : 255.255.0.0
    Default Gateway . . . . . . . . . :
Tunnel adapter Teredo Tunneling Pseudo-Interface:
    Media State . . . . . . . . . . . : Media disconnected
    Connection-specific DNS Suffix . :

위 출력 결과에서 볼 수 있듯이, 이더넷 어댑터와 가상 머신 관련 어댑터(VirtualBox Host-Only Network 등), 터널 어댑터(Teredo, isatap 등)의 상세한 네트워크 정보가 그대로 화면에 표시됩니다. 즉, 별도의 외부 라이브러리 없이도 시스템 명령의 실행 결과를 프로그램에서 그대로 확인할 수 있는 것입니다.

예제 2: 프로그램으로 컴퓨터 종료하기

두 번째 예제가 더욱 흥미롭습니다. 바로 C++ 코드만으로 컴퓨터를 종료(shutdown)하는 방법입니다. Windows에는 shutdown이라는 시스템 유틸리티가 내장되어 있는데, 이 프로그램의 경로를 system() 함수 안에 지정하기만 하면 됩니다.

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    system("C:\\WINDOWS\\System32\\shutdown /s");
}

실행 결과

"시스템이 곧 종료됩니다"라는 알림 창이 화면에 나타난 뒤,
컴퓨터가 자동으로 종료됩니다.

코드를 실행하면 잠시 후 "시스템을 종료하고 있습니다"라는 메시지가 담긴 팝업 창이 뜨고, 이후 컴퓨터가 실제로 꺼지게 됩니다. 참고로 옵션을 변경하면 다양한 동작을 수행할 수 있습니다. 예를 들어 /s는 시스템 종료, /r은 재시작, /a는 진행 중인 종료 취소, /t 초는 지정한 시간(초) 후 종료를 의미합니다.

마치며

이처럼 system() 함수를 사용하면 운영체제가 제공하는 명령줄 도구들을 C/C++ 프로그램에 손쉽게 통합할 수 있습니다. 단, 사용자 입력값을 그대로 system()에 전달하면 명령 삽입(command injection) 같은 보안 취약점이 발생할 수 있으므로, 실무에서는 고정된 명령어만 전달하거나 더 안전한 대안을 검토하는 것이 좋습니다.