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

C++에서 시스템 호출로 구현하는 스톱워치 타이머

이 글에서는 시스템 호출(system call)을 활용하여 C++로 타이머를 구현하는 방법을 알아봅니다. 그래픽이나 애니메이션은 일절 사용하지 않으며, 순수하게 콘솔 환경에서만 동작합니다.

여기서 말하는 타이머는 스톱워치(stopwatch), 즉 시간을 0부터 위로 올려가며 카운트하는 방식의 시계를 의미합니다. 이 예제에서 사용되는 핵심 시스템 호출은 다음 두 가지입니다.

핵심 시스템 호출

1. sleep(n)

프로그램을 n초 동안 대기(슬립) 상태로 만드는 함수입니다. 1초마다 화면을 갱신하는 타이머의 핵심 역할을 담당합니다.

2. system()

문자열 형태의 명령어를 인자로 전달하여 해당 시스템 명령을 실행하는 함수입니다. 이 예제에서는 화면을 지우는 용도로 활용됩니다.

참고: Windows 환경에서는 화면 지우기 명령으로 "cls"를 사용하고, Linux나 macOS 같은 유닉스 계열 운영체제에서는 "clear"를 사용해야 합니다. 또한 sleep() 함수의 단위도 플랫폼에 따라 초(unistd.h)와 밀리초(windows.h의 Sleep())가 다르므로 개발 환경에 맞게 조정이 필요합니다.

예제 코드

#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
int hrs = 0;
int mins = 0;
int sec = 0;
void showClk() {
    system("cls");
    cout << setfill(' ') << setw(55) << " TIMER \n";
    cout << setfill(' ') << setw(66) << " --------------------------------------\n";
    cout << setfill(' ') << setw(29);
    cout << "| " << setfill('0') << setw(2) << hrs << " Hours | ";
    cout << setfill('0') << setw(2) << mins << " Minutes | ";
    cout << setfill('0') << setw(2) << sec << " Seconds |" << endl;
    cout << setfill(' ') << setw(66) << " --------------------------------------\n";
}
void systemCallTimer() {
    while (true) {
        showClk();
        sleep(1);
        sec++;
        if (sec == 60) {
            mins++;
            if (mins == 60) {
                hrs++;
                mins = 0;
            }
            sec = 0;
        }
    }
}
int main() {
    systemCallTimer();
}

코드 동작 원리

이 프로그램의 구조는 크게 두 부분으로 나눌 수 있습니다.

showClk() — 화면 출력 함수

먼저 system("cls")를 호출하여 이전에 출력된 내용을 모두 지운 뒤, iomanip 헤더의 setfill()setw() 조작자(manipulator)를 사용해 정렬된 형태의 시계 화면을 출력합니다. setfill('0')은 한 자리 숫자 앞을 0으로 채워 01, 02처럼 표시하도록 도와줍니다.

systemCallTimer() — 무한 루프 카운터

while(true) 무한 루프 안에서 매 반복마다 화면을 갱신하고 sleep(1)로 1초를 대기한 후 초(sec) 값을 1씩 증가시킵니다. 초가 60에 도달하면 분(mins)을 증가시키고, 분이 60에 도달하면 시간(hrs)을 증가시키는 자리올림 로직이 포함되어 있습니다.

실행 결과

컴파일 후 프로그램을 실행하면 콘솔 창에 아래와 같이 깔끔하게 정렬된 타이머가 출력되며, 1초 간격으로 시간이 실시간으로 올라가는 것을 확인할 수 있습니다.

| 00 Hours | 00 Minutes | 00 Seconds |

이처럼 별도의 외부 라이브러리 없이 기본적인 시스템 호출과 입출력 조작자만으로도 간단하지만 완성도 있는 콘솔 타이머를 만들 수 있습니다. 응용하여 시작·정지 기능을 추가하거나, chrono 라이브러리를 결합해 더 정밀한 시간 측정 기능으로 확장할 수도 있습니다.