본문 바로가기

별걸다하는 IT/프로그래밍언어

[C언어, 자바] 운영체제에 따른 Sleep, sleep, usleep 함수 (리눅스/유닉스와 윈도우), 특정시간 지연시키기

반응형

[C /C++ 완전정복 목차]

안녕하세요. 오늘은 아주 간단한 포스팅이 될거예요 ㅎㅎ

워낙 많이 쓰는 sleep 함수에 대해 알아볼겁니다. 참고로 sleep은 지정한 시간동안 대기하는 '타임딜레이 함수'예요. 

이렇게 지연시키는 함수는 타임아웃 테스트나 세션 테스트 등 여러 상황에서 활용되죠 :)

[C/C++언어]

sleep() / Sleep() 함수

지정한 시간 만큼 대기합니다.

sleep에는 첫 글자가 대문자로 시작하는 Sleep함수가 있고 소문자로 시작하는 sleep함수 두 가지가 있는데요.

윈도우에서 지원하는 대기함수는 Sleep으로 단위가 밀리초(ms)이고,

리눅스/유닉스에서 지원하는 대기 함수는 sleep으로 단위가 초(second)입니다.

단위 - 밀리세컨즈
단위 - 세컨즈

윈도우의 경우 헤더파일은 <Windows.h>, 리눅스유닉스의 경우 헤더파일은 <unistd.h>입니다.

 

[윈도우에서 간단한 확인코드] Sleep - ms단위

#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main() 
{
	printf("시작\n");
	time_t begin;  time(&begin);
    
	Sleep(3000); //3초기다림
	
	time_t end;  time(&end);
	printf("실행시간 %0.0f초\n", difftime(end, begin));
	return (0);
}

3000 밀리초는 3초! (1밀리초는 0.001초 입니다)

결과

[리눅스/유닉스에서 간단한 확인코드] sleep - sec단위

#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main() 
{
	printf("시작\n");
	time_t begin; time(&begin);
	
	sleep(3); //3초기다림

	time_t end; time(&end);
	printf("실행시간 %0.0f초\n", difftime(end, begin));
	return (0);
}

윈도우에서는 밀리초 단위로 대기탈 수 있으니까 1초보다 작은 100ms, 10ms도 홀딩이 가능한데, 리눅스유닉스의 sleep의 경우 기본단위가 초잖아요. 리눅스유닉스에서 초보다 작은 시간동안 홀딩하고 싶을 때에는 어떻게 해야할까요?

usleep 함수 

마이크로초 단위도 지원을 해주기 위해 리눅스에서는 usleep 함수를 지원하고 있어요. 헤더는 동일하니 만약 1초보다 세분해서 대기를 걸고 싶으면 sleep대신 usleep을 사용해주면 됩니다. 사용방법은 sleep과 동일해요

#include <unistd.h>
int usleep(useconds_t usec);

usleep(100000) = 1초! 

 

[운영체제 호환]

운영체제 상관없이 동일하게 작동시키려면 어떻게 해야할까요?

Window API를 사용할 경우 sleep함수에 Sleep((x*10000))을 매크로 걸어서 리눅스유닉스의 sleep과 통일시킬 수 있겠죠.

#ifdef _WIN32   //윈도우일경우
#define sleep(x) Sleep((x*1000))
#endif
sleep(2);       // 2초동안 sleep

[JAVA언어]

자바의 경우 JVM특성으로 때문에 운영체제에 영향을 받지 않죠. 알아서 운영체제에 맞게 바이트머신이 변환해주기 때문이야요 그래서 C언어와는 다르게 윈도우냐 리눅스냐에 관계없이 동일하게 밀리세컨즈를 기준으로 코드를 짜시면 됩니다.

public class Test {
	public static void main(String args[]) {
    	System.out.println("before");
        try {
        	Thread.sleep(2000);    //2초 sleep
        } catch (InterruptedException e){
        	e.printStackTrace();
        }
        System.out.println("after");
    }
}

 

오늘은 간단하게 타임딜레이에 사용되는 sleep함수에 대해 알아보았어요.

도움이 되셨다면 공감 어떤가요?! :)

다음 포스팅에서 또 봐요

반응형