usleep() 함수는 호출하는 스레드의 실행을 일시 중단하며, 마이크로초(microseconds)가 경과하거나 스레드에게 신호가 전달되어 신호 처리 함수를 호출하거나 프로세스를 종료할 때까지 기다립니다.
#include <unistd.h>
int usleep(useconds_t useconds);
useconds_t useconds: 정지하고싶은 시간(microseconds)
반환값 : 성공적으로 종료되었을 시 0 오류 발생 시 -1 반환
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tv,
struct timezone *_Nullable restrict tz);
gettimeofday() 함수는 시간과 타임존을 가져오고 설정할 수 있습니다 tv구조체는 1970.1.1 00:00:00 이후로 지난 시간을 초와 마이크로초 단위로 표현하고 tz구조체는 그리니치와의 시간차와 dst보정 유형을 고를 수 있습니다(현재는 잘 사용하지 않음으로 NULL지정)
tv구조체
struct timeval {
time_t tv_sec; /* 초 (seconds) */
suseconds_t tv_usec; /* 마이크로초 (microseconds) */
};
tz구조체
struct timezone {
int tz_minuteswest; /* 그리니치(Greenwich)와의 시간차 (분 단위) */
int tz_dsttime; /* DST(Daylight Saving Time) 보정 유형 */
};
tv : Epoch(1970.1.1 00:00:00)시간을 기준으로 얼마나 지났는지 초(s) 단위와 마이크로초(us)단위로 저장 할 구조체 이다
tz : 그리니치와의 시간차 조정 및 DST 보정 설정가능 현재는 잘 사용하지않아 NULL설정
반환값 : 함수가 정상 종료 되었을 시 0반환 오류 발생 시 -1반환
👀 restrict 키워드 : gettimeofday 매개변수를 보면 struct timeval *restrict tv로 정의되어져 있는 것을 볼 수 있다 이때 restrict란 해당 포인터가 가리키고 있는 영역을 다른 포인터가 접근할 수 없게 보장하는 것이다
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void *),
void *restrict arg);
pthread_create() 함수는 호출한 process 내에서 새로운 thread를 만들어 준다 새로운 thread는 arg를 인자로start_routine() 함수를 호출하여 실행을 시작합니다 새로운 thread는 다음 중 하나의 방법으로 종료됩니다
pthread_t *restrict thread : 성공적으로 pthread_create 함수가 호출되었을 시 새로운 thread의 ID를 thread에 저장한다
const pthread_attr_t *restrict attr : thread의 속성을 결정하는데 사용한다 NULL로 설정할 시 기본 속성으로 생성된다
void *(*start_routine)(void *) : 새로운 thread가 호출하여 동작할 함수를 포인터로 받는다
void *restrict arg : start_routine 함수에서 사용할 인자를 넣어준다
반환값 : 성공적으로 동작 하였을 시 0을 반환 오류 발생 시 오류 번호를 반환하고 thread에 내용을 정의하지 않는다
pthread_create man
#include <pthread.h>
int pthread_detach(pthread_t thread);
thread를 만들게 되면 결합 상태로 생성된다 이 상태에서 thread가 종료 될 시 리소스가 해제되지않고 남게 되는데 이때 pthread_detach함수를 이용하면 thread를 분리 상태로 만들어서 thread가 종료될 시 자원이 자동으로 회수되게 만들 수 있다 이미 분리 된 thread에 pthread_detach() 함수를 실행 할 시 정의되지않은 동작이 발생할 수 있으므로 한 thread에 두번 이상 호출은 금지되어야한다
pthread_t thread : 분리할 thread를 매개변수로 받는다
반환값 : 성공적으로 실행됬을 시 0 반환 오류 발생 시 오류번호를 반환
pthread_detach man
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
pthread_join() 함수는 지정된 thread가 종료될 때까지 대기하며 해당 thread가 이미 종료된 경우 즉시 반환됩니다 thread로 지정된 thread는 반드시 결합 상태여야 합니다 만약 retval이 NULL이 아니라면 대상 thread의 종료(취소) 상태를 retval이 가리키는 위치로 복사합니다 만약 여러 thread가 동시에 같은 thread와 join을 시도하는건 정의되지않았기 때문에 이루어져서는 안됩니다
pthread_t thread : pthread_join()함수가 대기할 thread
void **retval : thread의 종료(취소) 상태를 저장할 포인터
반환값 : 성공적으로 동작 했을 시 0을 반환 오류발생시 오류번호 반환
pthread_join man
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
pthread_mutex_init() 함수는 mutex를 attr로 지정된 속성으로 초기화 합니다 attr이 NULL인 경우 기본 mutex속성이 사용됩니다 성공적으로 초기화되면 mutex의 상태는 초기화 되고 잠금이 해제된 상태가 됩니다
pthread_mutex_t *restrict mutex : 초기화할 mutex
const pthread_mutexattr_t *restrict attr : 초기화할때 사용할 속성
반환값 : 성공적으로 동작 했을 시 0을 반환 아니면 오류번호를 반환
pthread_mutex_init man
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_destroy() 함수는 잠겨있지 않은 mutex 객체를 파괴합니다 파괴된 mutex객체는 초기화되지 않은 상태가 됩니다 파괴된 mutex는 pthread_mutex_init() 함수를 사용하여 다시 초기화 할 수 있습니다 락이 걸린 mutex를 파괴하거나 다른 thread가 락을 걸려고 시도하는 mutex를 파괴하거나 다른 thread가 pthread_cond_timedwait() 또는 pthread_cond_wait() 호출 시 사용하는 뮤텍스를 파괴하는 것은 정의되지 않은 동작을 초래합니다. 초기화 되지않은 mutex에 사용하는 것도 정의되지 않았습니다
pthread_mutex_t *mutex : 파괴할 mutex
반환값 : 성공적으로 동작 시 0을 반환 오류 발생 시 오류번호를 반환
pthread_mutex_destroy man
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_lock() 함수는 참조하는 mutex객체를 잠그는 역할을 합니다 만약 다른 thread에 의해 이미 mutex가 잠겨져 있다면 호출하는 thread는 mutex가 사용 가능해질 때까지 블록됩니다 이 연산은 호출한 thread를 소유자로 두고 mutex객체를 잠긴 상태로 반환합니다 초기화되지 않은 mutex를 참조한다면 정의되지않은 동작이므로 초기화하고 사용해야합니다
pthread_mutex_t *mutex : 잠글 mutex
반환값 : 성공적으로 동작 시 0을 반환 오류 발생 시 오류번호를 반환
pthread_mutex_lock man
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_unlock 함수는 mutex가 참조하는 객체를 해제합니다 thread가 mutex를 unlock하면 lock개수가 1씩 감소하고 lock개수가 0이되면 mutex를 다른 thread들이 획득할 수 있게 됩니다 초기화되지 않은 mutex를 참조한다면 정의되지않은 동작이므로 초기화하고 사용해야합니다
pthread_mutex_t *mutex : 해제할 mutex
반환값 : 성공적으로 동작 시 0을 반환 오류 발생 시 오류번호를 반환
#include <signal.h>
int kill(pid_t pid, int sig);
kill 함수는 시그널을 특정 프로세스나 프로세스 그룹에 보내는데 사용할 수 있습니다
PID | Signal이 전달되는 곳 |
---|---|
양수 | PID로 지정된 프로세스에 Signal이 전달됩니다 |
0 | 호출하는 프로세스의 프로세스 그룹에 속한 모든 프로세스에 Signal이 전달됩니다 |
-1 | 호출 하는 프로세스가 signal을 보내는 권한을 가진 모든 프로세스에 보내집니다 단 init프로세스(1)은 제외됩니다 |
-1을 제외한 음수 | pid의 반대 부호인 프로세스 그룹에 속한 모든 프로세스에 Signal이 전달됩니다 |
만약 signal이 0이라면 실제 시그널은 보내지 않지만 존재 및 권한 확인을 수행 할 수 있습니다
pid_t pid : 시그널을 보내고싶은 pid
sig : 보내고 싶은 시그널 번호
반환값 : 성공 시 (적어도 하나의 신호가 전송된 경우) 0반환 오류 발생 시 -1 반환
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value);
세마포어를 초기화하고 열어줍니다
const char *name : 세마포어의 이름을 명시해줍니다
int oflag : sem_open함수의 플래그를 지정합니다 (<fcntl.h>의 flag 사용) oflag에 O_CREAT이 지정되어 있다면 세마포어가 존재하지 않으면 생성됩니다 세마포어의 id와 그룹 id는 호출 프로세스의 id와 그룹 id로 설정됩니다 O_CREAT 과 O_EXCL을 동시에 사용하는 경우 주어진 이름을 가진 세마포어가 이미 존재하는 경우 오류가 반환됩니다
mode_t mod : oflag에 O_CREAT이 지정된 경우 인자를 넣어줘야됩니다 mode인자는 새로운 세마포어에 적용할 권한을 지정합니다 이때 mode는 open함수와 같습니다 기호 정의는 <sys/stat.h>에 포함되어져 있습니다
unsigned int value : oflag에 O_CREAT이 지정된 경우 인자를 넣어줘야됩니다 value 인자는 세마포어의 초기 값입니다
O_CREAT이 지정되어 있어도 주어진 이름을 가진 세마포어가 이미 존재하는 경우 mode 와 value는 무시됩니다
반환값 : 성공 시 새로운 세마포어의 주소를 반환하며 에러가 발생했을 시 SEM_FAILED를 반환합니다
sem_open man
#include <semaphore.h>
int sem_close(sem_t *sem);
sem_close 함수는 매개변수로 받은 세마포어를 닫아줍니다 이로서 close된 세마포어에 있던 자원을 해제할 수 있게 됩니다
sem_t *sem : close 하고싶은 semapore의 주소
반환 값 : 성공할 경우 0을 반환 오류 발생 시 -1 반환
#include <semaphore.h>
int sem_post(sem_t *sem);
매개변수로 받은 세마포어의 카운터를 하나 증가시킵니다 (unlock) 증가 후 세마포어의 값이 0보다 큰 값이 되면 sem_wait호출에서 블록된 프로세스나 스레드가 깨어나 세마포어를 잠구게 됩니다
sem_t *sem : unlock하고 싶은 세마포어의 주소
반환 값 : 성공할 경우 0을 반환 오류가 발생 시 -1 반환(세마포어 값 변화 X)
#include <semaphore.h>
int sem_wait(sem_t *sem);
매개변수로 받은 세마포어의 카운터를 하나 감소시킵니다 (lock) 만약 세마포어의 값이 0보다 크다면 감소가 진행되고 함수는 즉시 반환됩니다 만약 세마포어의 값이 현재 0이라면 세마포어의 값이 0보다 커지거나 signal handler가 호출을 중단할 때까지 대기합니다
sem_t *sem : 카운터를 감소시킬 semapore의 주소값
반환 값 : 성공적으로 동작할 경우 0을 반환 오류가 발생되면 세마포어의 값은 변경되지 않고 -1을 반환
#include <semaphore.h>
int sem_unlink(const char *name);
매개변수로 받은 세마포어를 제거합니다 만약 세마포어를 열어둔 프로세스가 존재하면 모든프로세스가 세마포어를 close 할 때까지 제거를 연기합니다
const char *name : 제거할 세마포어의 이름
반환 값 : 성공적으로 동작할 경우 0을 반환 오류 발생 시 -1 반환