programing

C에서 밀리초 단위로 대체 수면 기능이 있습니까?

goodcopy 2022. 7. 26. 22:37
반응형

C에서 밀리초 단위로 대체 수면 기능이 있습니까?

윈도우에서 컴파일된 소스 코드를 가지고 있습니다.Red Hat Linux에서 실행되도록 변환합니다.

소스 코드에는<windows.h>header file과 프로그래머가 사용하였습니다.Sleep()밀리초 동안 대기하는 함수입니다.Linux 에서는 동작하지 않습니다.

단, 이 경우sleep(seconds)단, 초단위의 정수를 사용합니다.밀리초를 초로 변환하고 싶지 않습니다.Linux에서 gcc 컴파일과 함께 사용할 수 있는 대체 sleep 기능이 있나요?

예 - 오래된 POSIX 표준이 정의되어 있기 때문에 Linux에서 사용할 수 있습니다.

int usleep(useconds_t usec);

묘사

usleep() 함수는 (적어도) usec 마이크로초 동안 호출 스레드의 실행을 중지합니다.sleeve는 시스템액티비티, 콜 처리에 소비하는 시간, 또는 시스템타이머의 정밀도에 의해 약간 길어질 수 있습니다.

usleep()마이크로초가 걸리기 때문에 밀리초 안에 sleep 하려면 입력에 1000을 곱해야 합니다.


usleep()는 그 후 폐지되어 POSIX에서 삭제되었습니다.새로운 코드의 경우는, 다음과 같이 하는 것이 좋습니다.

#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

묘사

nanosleep()는, 적어도 에서 지정한 시간까지, 발신측 스레드의 실행을 정지합니다.*req가 경과한 경우, 또는 발신측 스레드내의 핸들러의 호출을 트리거 하는 신호 또는 프로세스를 종료하는 신호의 전달.

구조 timespec은 나노초 정밀도로 시간 간격을 지정하기 위해 사용됩니다.이것은 다음과 같이 정의됩니다.

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

msleep()를 사용하여 구현된 기능nanosleep()신호로 인해 중단된 경우 sleeve를 계속합니다.

#include <time.h>
#include <errno.h>    

/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
    struct timespec ts;
    int res;

    if (msec < 0)
    {
        errno = EINVAL;
        return -1;
    }

    ts.tv_sec = msec / 1000;
    ts.tv_nsec = (msec % 1000) * 1000000;

    do {
        res = nanosleep(&ts, &ts);
    } while (res && errno == EINTR);

    return res;
}

다음 크로스 플랫폼 기능을 사용할 수 있습니다.

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    if (milliseconds >= 1000)
      sleep(milliseconds / 1000);
    usleep((milliseconds % 1000) * 1000);
#endif
}
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds

Usleep 이외에는 NULL 파일 기술자 세트를 갖춘 겸손한 선택으로 마이크로초의 정밀도로 일시중지할 수 있습니다.또, 다음의 리스크는 없습니다.SIGALRM합병증

sigtimedwaitsigwaitinfo 는 같은 동작을 제공합니다.

또는 POSIX 2008에서는 정의되어 있지 않습니다(POSIX 2004까지 정의되어 있으며 POSIX 준거 이력이 있는 Linux 및 기타 플랫폼에서 사용할 수 있습니다).POSIX 2008 표준에서는 다음과 같이 정의되어 있습니다.

nanosleep- 고해상도 sleep

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

nanosleep()함수는 현재 스레드의 실행을 중단해야 합니다.rqtp인수가 경과하거나 신호가 발신측 스레드에 전달되며, 그 액션은 신호 캡처 함수를 호출하거나 프로세스를 종료하는 것입니다.인수 값이 수면 분해능의 정수 배수로 반올림되거나 시스템에 의한 다른 활동의 스케줄 설정 때문에 중단 시간이 요청된 것보다 길어질 수 있습니다.은 ,, 호, 호, 신, 음에서 한 시간 .rqtp CLOCK_REALTimeCLOCK_REALTIME으로

「 」의 nanosleep()기능은 신호의 작동 또는 차단에 영향을 미치지 않습니다.

#include <stdio.h>
#include <stdlib.h>
int main () {

puts("Program Will Sleep For 2 Seconds");

system("sleep 2");      // works for linux systems


return 0;
}

언급URL : https://stackoverflow.com/questions/1157209/is-there-an-alternative-sleep-function-in-c-to-milliseconds

반응형