nanosleep() - 프로세스/쓰레드의 실행을 멈추는(재우는) 함수
- 프로그래밍/리눅스 프로그래밍
- 2022. 4. 20.
nanosleep()은 특정 시간 동안 프로세스/쓰레드를 재우는데(동작을 멈추는데) 사용된다.
개인적으로는 지금까지 마이크로초 단위의 함수인 usleep()을 많이 사용했는데(sleep() 함수가 초단위라서 너무 긴 경우에), 이번 기회에 nanosleep()으로 변경하게 되었다.
찾아보니, usleep() 대신 nanosleep()을 쓰는게 좋은 듯 하고 특히 nanosleep()은 POSIX 함수라고 한다.
인자로 단순히 마이크로초 단위의 시간값을 전달해 주는 usleep() 함수에 비해 nanosleep() 함수의 사용법이 아주 조금 더 복잡하긴 하지만, 사용하기 어려운 수준은 아닌 듯 하다.
nanosleep()의 함수 원형은 다음과 같다.
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
req 인자에 잠들고 싶은 시간을 넣고 rem 인자는 비운 상태로 함수를 호출하면, req에 지정한 시간만큼 지난 후에 함수가 리턴된다. 함수가 리턴되기 전까지 프로세스/쓰레드가 잠들어 있는 셈이다.
만약 잠들어 있는 중간에 인터럽트 등으로 인해 함수가 리턴되면, rem 인자에 남은 시간(req에 지정한 시간 - 현재까지 잠들었던 시간)이 반환된다고 한다. 그럼 그 남은 시간(rem)을 req 인자로 전달하는 nanosleep() 함수를 다시 호출함으로써 원래 목표했던 시간만큼을 멈출 수 있다고 한다.
timespec 구조체는 tv_sec 변수와 tv_nsec 변수로 구성되어 있으므로, 원하는 시간값을 초 단위 수와 나노초 단위 수로 나누어 req 인자에 지정하면 된다.
다음은 nanosleep() 함수를 이용하여 1.234567891 초만큼 잠드는 간단한 예이다.
struct timespec req, rem;
req.tv_sec = 1;
req.tv_nsec = 234567891;
nanosleep(&req, &rem);
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
리눅스 타이머 프로그래밍 (2) | 2023.01.15 |
---|---|
리눅스 타이머 프로그래밍 (0) | 2023.01.15 |
리눅스 어플리케이션 반복 실행 테스트 방법 (1) | 2022.09.25 |
Kernel PPS 신호 사용하기 (C source code) (0) | 2022.03.26 |
CURL 라이브러리 사용법 - 임베디드 플랫폼용으로 빌드하기(arm-cross-sysroot 활용) (0) | 2021.03.09 |
리눅스 TUN/TAP 디바이스 프로그래밍 (1) | 2021.01.28 |
프로세스 간 통신(IPC) 프로그래밍 - 메시지큐 (0) | 2021.01.19 |
GPSd를 이용한 GNSS 프로그래밍 (0) | 2020.12.24 |