Philosophers๊ณผ์ ํจ์
memset
, printf
, malloc
, free
, write
, fork
, kill
,
exit
, pthread_create
, pthread_detach
, pthread_join
,
usleep
, gettimeofday
, waitpid
, sem_open
, sem_close
,
sem_post
, sem_wait
, sem_unlink
1. semaphore ํจ์
์ธ๋งํฌ์ด๋ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๊ณตํต ์์/์์ญ์ ์ ํด์ค ์์ ํ๋ก์ธ์ค/์ค๋ ๋๋ง์ด ์ฌ์ฉํ๋ ๊ธฐ๋ฒ. ์ธ๋งํฌ์ด๋ ์์คํ ์์ฒด์ ๊ฑธ์ณ์๋ ์์คํ ์์ ํ์ผ๋ก์ ์กด์ฌํ๋ฉฐ, ์์คํ ์ด ํด์ ํ์ง ์์ผ๋ฉด ์์คํ ์ด ๋จ์์๋ํ ์ฌ๋ผ์ง์ง ์๋๋ค.
๋ฎคํ ์ค์์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธ๋งํฌ์ด๋ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์์ ๋ณดํธํ๋ค. ๋ฎคํ ์ค๋ ํ ํ๋ก์ธ์ค ๋ด์ ์ค๋ ๋๊ฐ์ ๊ณต์ ํ๋ ์์/์์ญ์ ๋ณดํธํ๋ค.
- ์ธ๋งํฌ์ด๋ ์๊ณ๊ตฌ์ญ/๊ณต์ ์์์ ์ ๊ทผํ๋ ํ๋ก์ธ์ค/์ค๋ ๋์ ์(1~n)๋ฅผ ์ ํํ์ ์๋ค. ๋ฎคํ ์ค๋ ์๊ณ๊ตฌ์ญ/๊ณต์ ์์์ ๋์ ์ ๊ทผํ ์ ์๋ ์ค๋ ๋ ์๋ ์ค์ง ํ๋์ด๋ค.
- ์์ ๊ฐ์ ์ด์ ๋ก ์ธ๋งํฌ์ด๋ฅผ ๋ฎคํ ์ค์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค(ํฌํจ๊ฐ๋ ์ ์๋๋ผ๊ณ ํ๋คโฆ).
1.1 sem_open
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag, ...);
์ด๋ฆ์๋ ์ธ๋งํฌ์ด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ์ฌ ์ฌ๋ ํจ์.
- ์ธ์
const char *name
: ์ธ๋งํฌ์ด ๊ฐ์ฒด(? c์ธ๋ฐ?)์ ์ง์ ํ ์ด๋ฆ. - name์ด/
๋ก ์์ํ๋ ๊ฒฝ์ฐ(/name
) ์ธ๋งํฌ์ด๋/dev/sem/
์ ์์ฑ๋๋ค(/dev/sem/name
).
- name์ด
/
๋ก ์์ํ์ง ์๋ ๊ฒฝ์ฐ(name
) ์ธ๋งํฌ์ด๋/dev/sem/์์ ํด๋๋ช /
์ ์์ฑ๋๋ค(/dev/sem/์์ ํด๋๋ช /name
). -int oflag
: ์ธ๋งํฌ์ด ์์ฑ์ ์ ์ฉํ ํ๋๊ทธ. -O_CREAT
ํ๋๊ทธ ๋จ๋ : ํด๋น ์ด๋ฆ์ ์ธ๋งํฌ์ด๊ฐ ์์ผ๋ฉด ์์ฑํ๋ค. O_CREAT | O_EXCL
ํ๋๊ทธ : ํด๋น ์ด๋ฆ์ ์ธ๋งํฌ์ด๊ฐ ์๋๊ฒฝ์ฐ ์๋ฌ ๋ฐ์.O_EXCL
ํ๋๊ทธ ๋จ๋ : undefind behavior -...
:O_CREAT
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๊ฒฝ์ฐmode_t mode
,const unsigned int value
๋ฅผ ๊ธฐ์ ํ๋ค(sem_t *sem_open(const char *name, O_CREAT |... , mode_t mode, unsigned int value)
).
- ๋ฐํ๊ฐ
- ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ(
sem_t *
) ๋ฐํ. ์ด ๋์คํฌ๋ฆฝํฐ๊ฐ์ ์ด์ฉํด์set_ํจ์
๋ค์ ์ด์ฉํ ์ ์๋ค. ์คํจ์ ~๋ฅผ ๋ฐํํ๊ณ errno์ค์ .
- ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ(
- ์ค์ ์ฌ์ฉ :
sem_t *sem_open("name", O_CREAT | O_EXCL, 0644, ์ด๊ธฐ๊ฐ);
3๋ฒ์งธ ์ธ์๋ mode๊ฐ์ด๋ฉฐ, ํด๋น ์ธ๋งํฌ์ด์ ์ ๊ทผ๊ถํ์ ์ค์ ํ๋ค.0644
์ต์ ์ ์ฃผ๋ฃ ์ฌ์ฉ.6
์0b110
(0brwx)์ผ๋ก, ๊ฐ์ ์ ์ ์๊ฒ read & write๊ถํ์ ๋ถ์ฌ๋ฅผ ์๋ฏธํ๋ค.4
์0b100
์ผ๋ก, ๊ทธ๋ฃน์๊ฒ read ๊ถํ์ ๋ถ์ฌ๋ฅผ ์๋ฏธํ๋ค.4
์0b100
์ผ๋ก, ๊ทธ ์ธ์๊ฒ read ๊ถํ์ ๋ถ์ฌ๋ฅผ ์๋ฏธํ๋ค.- ์ฐธ๊ณ : c์์
0
์ผ๋ก ์์ํ๋ ์ซ์๋ ํ๊ธฐ๋ฒ(notation)์ ์๋ฏธํ๊ณ ,0x
์ ๊ฐ๋ค.
์ฐธ๊ณ ํ ๊ธ : stackoverflow
1.2 sem_close
#include <semaphore.h>
int sem_close(sem_t *sem);
์ด๋ฆ์๋ ์ธ๋งํฌ์ด์ ํ ๋น๋ ์์๋ค์ ํด์ ํ๊ณ , ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ๋ฅผ ์๋ฏธ์๊ฒ ํ๋(์์ ๋)ํจ์. ์ด๋ฆ์๋ ์ธ๋งํฌ์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ undefine behavior
- ์ธ์
sem_t *sem
: ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ
- ๋ฐํ๊ฐ
- ์ฑ๊ณต์
0
, ์คํจ์-1
๋ฐํํ๊ณ errno์ค์ .
- ์ฑ๊ณต์
1.3 sem_wait
#include <semaphore.h>
int sem_wait(sem_t *sem);
์ธ๋งํฌ์ด(sem)์ ๊ฐ(๊ฐ์ฉ ์์)์ด 0 ์ด์๋ผ๋ฉด ๊ฐ์ 1๋ฎ์ถ๊ณ ์๊ณ ์์ญ ๋ด๋ก ์ง์ ์ํจ๋ค. ๋ง์ฝ 0์ด๋ผ๋ฉด blockํ์ฌ ๋๊ธฐํ์์ ํด๋น ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ค. ๊ฐ์ฉํ ์์์ด 1์ด์์ด ๋๋ฉด ์ธํฐ๋ฝ์ค ์๊ทธ๋์ ์ํด ๋๊ธฐํ์ ์๋ ํ๋ก์ธ์ค์ค ํ๋๊ฐ ์๊ณ๊ตฌ์ญ ๋ด๋ก ์ง์ ํ๊ฒ ๋๋ค.
- ์ธ์
sem_t *sem
: ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ
- ๋ฐํ๊ฐ
- ์ฑ๊ณต์
0
, ์คํจ์-1
๋ฐํํ๊ณ errno์ค์ ํ๋ฉฐ ์ธ๋งํฌ์ด์ ์ํ๋ ๋ณํ์ง ์๋๋ค.
- ์ฑ๊ณต์
1.4 sem_post
#include <semaphore.h>
int sem_post(sem_t *sem);
ํน์ ํ๋ก์ธ์ค/์ค๋ ๋์ ์๊ณ์์ญ ์ฌ์ฉ์ด ๋๋ ํ, ์ธ๋งํฌ์ด(sem)์ ๊ฐ์ ์ฆ๊ฐ์์ผ ๋ค์ ํ๋ก์ธ์ค/์ค๋ ๋๊ฐ ๊ฐ์ฉํ๊ฒ ํ๋ ํจ์.
- ์ธ์
sem_t *sem
: ์ธ๋งํฌ์ด ๋์คํฌ๋ฆฝํฐ
- ๋ฐํ๊ฐ
- ์ฑ๊ณต์
0
, ์คํจ์-1
๋ฐํํ๊ณ errno์ค์ .
- ์ฑ๊ณต์
1.5 sem_unlink
#include <semaphore.h>
sem_t * sem_unlink(const char *name);
์ด๋ฆ์๋ ์ธ๋งํฌ์ด์ ์ด๋ฆ์ ์ ๊ฑฐํ๋ ํจ์. sem_closeํ์ฌ ์์๋ค ๋ฐํํ sem_unkinkํ์ฌ ์ด๋ฆ์ ์์ ์ผํ๋ค(์์ ์ง์ผ์ผํจ).
- ์ธ์
const char *name
:
- ๋ฐํ๊ฐ
- ์ฑ๊ณต์
0
, ์คํจ์-1
๋ฐํํ๊ณ errno์ค์ ํ๋ฉฐ ์ธ๋งํฌ์ด์ ์ํ๋ ๋ณํ์ง ์๋๋ค.
- ์ฑ๊ณต์
1.6 sem_close์ sem_unlink
sem_unlink๋ฅผ ํตํด ํน์ ์ธ๋งํฌ์ด๋ฅผ ์ญ์ ํ๋ค๊ณ ํ์๋, ํน์ ํ๋ก์ธ์ค๊ฐ ๊ทธ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ , sem_close๊ฐ ํธ์ถ๋ ๋๊น์ง ์ญ์ ๊ฐ ์ง์ฐ๋๋ค(= sem_close๊ฐ ํธ์ถ๋๋ฉด ์ญ์ ๋๋ค). sem_close๋ํ, sem_unlink์์ด ํธ์ถ๋์๋ค๋ฉด ๋จ๋ ์ผ๋ก ์ธ๋งํฌ์ด๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ค๊ณ ํ๋คโฆ
์ฐธ๊ณ ํ ๊ณณ : HYโs TIL blog
์ ์ฒด์ ์ธ ์ฐธ๊ณ : Jseo Doodle ๋ธ๋ก๊ทธ, yechoi tistory, JongeunKeum-Dev vlog