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
합병증
sigtimedwait 와 sigwaitinfo 는 같은 동작을 제공합니다.
또는 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
'programing' 카테고리의 다른 글
Java에서 서명되지 않은 int 선언 (0) | 2022.07.26 |
---|---|
C 프로그램에서 현재 디렉토리를 가져오려면 어떻게 해야 합니까? (0) | 2022.07.26 |
VueJS DevTools에서 Vuex를 '보이지 않음'으로 만드는 방법 (0) | 2022.07.26 |
Nuxt 및 vue에서의 Data() VS asyncData() (0) | 2022.07.26 |
Vuex 및 앱 전에 Vue 라우터를 로드하고 있습니다.3 (0) | 2022.07.26 |