inotify(7) - wariua/manpages-ko GitHub Wiki
inotify - ํ์ผ ์์คํ ์ด๋ฒคํธ ๊ฐ์ํ๊ธฐ
inotify API๋ ํ์ผ ์์คํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค. inotify๋ฅผ ์ด์ฉํด ๊ฐ๋ณ ํ์ผ์ ๊ฐ์ํ๊ฑฐ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ ์ ์๋ค. ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ ๋๋ ๋๋ ํฐ๋ฆฌ ์์ฒด์ ๊ทธ ๋๋ ํฐ๋ฆฌ ๋ด ํ์ผ๋ค์ ๋ํ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
์ด API์์ ์ฌ์ฉํ๋ ์์คํ ํธ์ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
inotify_init(2)์ inotify ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ inotify ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. ๋ ์ต์ ์ธ inotify_init1(2)์ inotify_init(2)๊ณผ ๋น์ทํ๋
flags
์ธ์๊ฐ ์์ด์ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. -
inotify_add_watch(2)๋ inotify ์ธ์คํด์ค์ ์ฐ๊ณ๋ "๊ฐ์ ๋ชฉ๋ก(watch list)"์ ์กฐ์ํ๋ค. ๊ฐ์ ๋ชฉ๋ก ๋ด์ ๊ฐ ํญ๋ชฉ์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ์ ๊ฒฝ๋ก๋ช ๊ณผ ํจ๊ป ๊ทธ ๊ฒฝ๋ก๋ช ์ด ๊ฐ๋ฆฌํค๋ ํ์ผ์ ๋ํด ์ปค๋์์ ๊ฐ์ํด์ผ ํ ์ด๋ค ์ด๋ฒคํธ ์งํฉ์ ๋ํ๋ธ๋ค. inotify_add_watch(2)๋ ์ ๊ฐ์ ํญ๋ชฉ์ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ๊ฐ์ ํญ๋ชฉ์ ๋ณ๊ฒฝํ๋ค. ๊ฐ ๊ฐ์ ํญ๋ชฉ์๋ ๊ณ ์ ํ "๊ฐ์ ๋์คํฌ๋ฆฝํฐ"๊ฐ ์๋๋ฐ, ๊ทธ ๊ฐ์ ํญ๋ชฉ์ ์์ฑํ ๋ inotify_add_watch(2)๊ฐ ๊ทธ ์ ์๋ฅผ ๋ฐํํ๋ค.
-
๊ฐ์ ๋์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ์ ๋ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์
read(2)
๋ก ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ด๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์ผ ์ ์๋ค. (์๋ ์ฐธ๊ณ .) -
inotify_rm_watch(2)๋ inotify ๊ฐ์ ๋ชฉ๋ก์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ค.
-
inotify ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ (close(2)๋ก) ๋ซํ๋ฉด ์ปค๋์์ ๊ธฐ๋ฐ ๊ฐ์ฒด์ ์์์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํด์ ํ๋ค. ์ฐ๊ณ๋ ๊ฐ์ ํญ๋ชฉ ๋ชจ๋๊ฐ ์๋์ผ๋ก ํด์ ๋๋ค.
์กฐ์ฌ์ค๋ฝ๊ฒ ํ๋ก๊ทธ๋๋ฐ ํ๋ค๋ฉด ์์ฉ์์ inotify๋ฅผ ์ด์ฉํด ํ์ผ ์์คํ ๊ฐ์ฒด๋ค์ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ํ๊ณ ์บ์ฑ ํ ์ ์๋ค. ํ์ง๋ง ๊ฒฌ๊ณ ํ ์์ฉ์ด๋ผ๋ฉด ๊ฐ์ ๋ก์ง์ ๋ฒ๊ทธ๋ ์๋์์ ์ค๋ช ํ ์ข ๋ฅ์ ๊ฒฝ์ ๋๋ฌธ์ ์บ์๊ฐ ํ์ผ ์์คํ ์ํ์ ์ผ์นํ์ง ์๊ฒ ๋ ์๋ ์๋ค๋ ์ ์ ๊ฐ์ํด์ผ ํ๋ค. ์๋ง ์ด๋ค ์ผ๊ด์ฑ ๊ฒ์ฌ๋ฅผ ํด์ ๋ถ์ผ์น ํ์ง ์ ์บ์๋ฅผ ์ฌ๊ตฌ์ถํ๋ ๊ฒ ๋ฐ๋์งํ ๊ฒ์ด๋ค.
์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์์๋ด๊ธฐ ์ํด ์์ฉ์์๋ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์ read(2)
๋ฅผ ํ๋ค. ์์ง ์ด๋ค ์ด๋ฒคํธ๋ ์ผ์ด๋์ง ์์ ๊ฒฝ์ฐ ๋ธ๋กํน ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ผ๊ณ ํ๋ฉด ์ ์ด๋ ํ ๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง read(2)
๊ฐ ๋ธ๋ก ํ๊ฒ ๋๋ค. (๋จ ์๊ทธ๋์ ์ํด ์ค๋จ๋๋ ๊ฒฝ์ฐ์๋ ํธ์ถ์ด EINTR
์ค๋ฅ๋ก ์คํจํ๋ค. signal(7) ์ฐธ๊ณ .)
read(2)
๊ฐ ์ฑ๊ณตํ๋ฉด ๋ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ํ ๊ฐ ์ด์ ๋ด์ ๋ฒํผ๋ฅผ ๋ฐํํ๋ค.
struct inotify_event {
int wd; /* ๊ฐ์ ๋์คํฌ๋ฆฝํฐ */
uint32_t mask; /* ์ด๋ฒคํธ ๊ธฐ์ ๋ง์คํฌ */
uint32_t cookie; /* ๊ด๋ จ ์ด๋ฒคํธ๋ค์ ์ฐ๊ณํด ์ฃผ๋
์ ์ผํ ์ฟ ํค ๊ฐ (rename(2)) */
uint32_t len; /* name ํ๋ ํฌ๊ธฐ */
char name[]; /* ์ ํ์ ์ธ ๋ ์ข
๋ฃ ์ด๋ฆ */
};
wd
๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฐ์ ๋์์ ์๋ณํด ์ค๋ค. ์์ inotify_add_watch(2) ํธ์ถ์ด ๋ฐํํ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ค ์ค ํ๋์ด๋ค.
mask
๋ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ ํ๋ ๋นํธ๋ค์ ๋ด๊ณ ์๋ค. (์๋ ์ฐธ๊ณ .)
cookie
๋ ๊ด๋ จ ์ด๋ฒคํธ๋ค์ ์ฐ๊ฒฐํด ์ฃผ๋ ์ ์ผ ์ ์์ด๋ค. ํ์ฌ๋ rename ์ด๋ฒคํธ์์๋ง ์ฐ๋๋ฐ ๋ฐ์ํ IN_MOVED_FROM
์ IN_MOVED_TO
์ด๋ฒคํธ ์์ ์์ฉ์์ ์ฐ๊ด ์ง์ ์ ์๊ฒ ํด ์ค๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ด๋ฒคํธ๋ค์์๋ cookie
๊ฐ 0์ผ๋ก ์ค์ ๋ผ ์๋ค.
name
ํ๋๋ ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๋ด ํ์ผ์ ๋ํ ์ด๋ฒคํธ๊ฐ ๋ฐํ๋ ๋๋ง ์กด์ฌํ๋ค. ์ฆ ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๋ด์ ํ์ผ๋ช
์ ๋ํ๋ธ๋ค. ์ด ํ์ผ๋ช
์ ๋๋ก ๋๋๋ฉฐ ํ์ ํญ๋ชฉ์ ์ ์ ํ ์ฃผ์ ๊ฒฝ๊ณ๋ก ์ ๋ ฌ์ํค๊ธฐ ์ํด ์ถ๊ฐ๋ก ๋ ๋ฐ์ดํธ('\0')๋ค์ด ์์ ์๋ ์๋ค.
len
ํ๋๋ ๋ ๋ฐ์ดํธ๋ฅผ ํฌํจํด name
์ ๋ฐ์ดํธ ๋ชจ๋์ ๊ฐ์์ด๋ค. ๋ฐ๋ผ์ ๊ฐ inotify_event
๊ตฌ์กฐ์ฒด์ ๊ธธ์ด๋ sizeof(struct inotify_event)+len
์ด๋ค.
read(2)
์ ์ค ๋ฒํผ๊ฐ ๋๋ฌด ์์์ ๋ค์ ์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ์ ๋์ ๋ฐฉ์์ ์ปค๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. 2.6.21 ์ ์ ์ปค๋์์๋ read(2)
๊ฐ 0์ ๋ฐํํ๋ฉฐ ์ปค๋ 2.6.21๋ถํฐ๋ read(2)
๊ฐ EINVAL
์ค๋ฅ๋ก ์คํจํ๋ค. ๋ค์ ํฌ๊ธฐ์ ๋ฒํผ๋ฅผ ์ง์ ํ๋ฉด ์ ์ด๋ ์ด๋ฒคํธ ํ ๊ฐ๋ ํ์คํ ์ฝ์ ์ ์๋ค.
sizeof(struct inotify_event) + NAME_MAX + 1
inotify_add_watch(2)์ mask
์ธ์์ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ read(2)
ํ ๋ ๋ฐํ๋๋ inotify_event
๊ตฌ์กฐ์ฒด์ mask
ํ๋๋ inotify ์ด๋ฒคํธ๋ค์ ๋ํ๋ด๋ ๋นํธ ๋ง์คํฌ์ด๋ค. inotify_add_watch(2) ํธ์ถ ์ mask
๋ง์คํฌ์ ๋ค์ ๋นํธ๋ค์ ์ง์ ํ ์ ์์ผ๋ฉฐ read(2)
์์ ๋ฐํํ๋ mask
ํ๋๋ก ๋ฐํ๋ ์ ์๋ค.
-
IN_ACCESS
(+) - ํ์ผ์ ์ ๊ทผํ์. (๊ฐ๋ น
read(2)
, execve(2).) -
IN_ATTRIB
(*) - ๋ฉํ๋ฐ์ดํฐ ๋ณ๊ฒฝ๋์. ์๋ฅผ ๋ค์ด ๊ถํ(chmod(2)), ํ์์คํฌํ(utimensat(2)), ํ์ฅ ์์ฑ(setxattr(2)), ๋งํฌ ์นด์ดํธ(๋ฆฌ๋ ์ค 2.6.25๋ถํฐ, link(2) ๋ฐ unlink(2) ๋์์ ๋ํด), ์ฌ์ฉ์/๊ทธ๋ฃน ID(chown(2)).
-
IN_CLOSE_WRITE
(+) - ์ฐ๊ธฐ์ฉ์ผ๋ก ์ด๋ฆฐ ํ์ผ์ด ๋ซํ์.
-
IN_CLOSE_NOWRITE
(*) - ์ฐ๊ธฐ์ฉ์ผ๋ก ์ด๋ฆฌ์ง ์์ ํ์ผ ๋ด์ง ๋๋ ํฐ๋ฆฌ๊ฐ ๋ซํ์.
-
IN_CREATE
(+) - ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๋ด์ ํ์ผ/๋๋ ํฐ๋ฆฌ ์์ฑ๋์. (๊ฐ๋ น open(2)
O_CREAT
,mkdir(2)
, link(2), symlink(2), ์ ๋์ค ๋๋ฉ์ธ ์์ผbind(2)
.) -
IN_DELETE
(+) - ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ์์ ํ์ผ/๋๋ ํฐ๋ฆฌ๊ฐ ์ญ์ ๋์.
IN_DELETE_SELF
- ๊ฐ์ ๋์ ํ์ผ/๋๋ ํฐ๋ฆฌ ์์ฒด๊ฐ ์ญ์ ๋์. (๋ค๋ฅธ ํ์ผ ์์คํ
์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ์๋ ์ด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ ๊ฒฝ์ฐ
mv(1)
๋ ์ค์ง์ ์ผ๋ก๋ ๋ค๋ฅธ ํ์ผ ์์คํ ์ผ๋ก ํ์ผ์ ๋ณต์ฌํ ๋ค์ ์๋ ํ์ผ ์์คํ ์์ ํ์ผ์ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.) ๋๋ถ์ด ๊ทธ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ก ์ด์ด์IN_IGNORED
์ด๋ฒคํธ๊ฐ ์์ฑ๋ ๊ฒ์ด๋ค. -
IN_MODIFY
(+) - ํ์ผ์ด ๋ณ๊ฒฝ๋์. (๊ฐ๋ น
write(2)
, truncate(2).) IN_MOVE_SELF
- ๊ฐ์ ๋์ ํ์ผ/๋๋ ํฐ๋ฆฌ ์์ฒด๊ฐ ์ด๋๋์.
-
IN_MOVED_FROM
(+) - ํ์ผ ์ด๋ฆ์ด ๋ฐ๋ ๋ ์ด์ ํ์ผ๋ช ์ ๋ด์ ๋๋ ํฐ๋ฆฌ์์ ์์ฑ๋จ.
-
IN_MOVED_TO
(+) - ํ์ผ ์ด๋ฆ์ด ๋ฐ๋ ๋ ์ ํ์ผ๋ช ์ ๋ด์ ๋๋ ํฐ๋ฆฌ์์ ์์ฑ๋จ.
-
IN_OPEN
(*) - ํ์ผ ๋ด์ง ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋ ธ์.
inotify ๊ฐ์๋ ์์ด๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค. ์ด๋ค ํ์ผ์ ๊ฐ์ํ ๋ (ํ์ผ์ ๋ด์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ๋ ๊ฒ ์๋ ๋) ๊ทธ ํ์ผ์ ๋ํ (๊ฐ๊ฑฐ๋ ๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ์) ์ด๋ ๋งํฌ์ ํ๋์ ์ํด์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ ๋,
-
์์ ๋ณํ(*)๊ฐ ๋ ์ด๋ฒคํธ๋ ๋๋ ํฐ๋ฆฌ ์์ฒด์ ๋๋ ํฐ๋ฆฌ ๋ด ๊ฐ์ฒด์ ๋ํด ์๊ธธ ์ ์๋ค.
-
๋ํ๊ธฐ ํ์(+)๊ฐ ๋ ์ด๋ฒคํธ๋ ๋๋ ํฐ๋ฆฌ ๋ด ๊ฐ์ฒด์ ๋ํด์๋ง ์๊ธธ ์ ์๋ค. (๋๋ ํฐ๋ฆฌ ์์ฒด์๋ ์๊ธฐ์ง ์๋๋ค.)
์ฐธ๊ณ : ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ ๋ ๊ทธ ๋๋ ํฐ๋ฆฌ ๋ฐ์ ์์นํ ๊ฒฝ๋ก๋ช (์ฆ ๋งํฌ)์ ํตํด ์ด๋ฒคํธ๊ฐ ์ํ๋ ๋๋ ๊ทธ ๋๋ ํฐ๋ฆฌ ๋ด ํ์ผ์ ๋ํด ์ด๋ฒคํธ๊ฐ ์์ฑ๋์ง ์๋๋ค.
๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๋ด ๊ฐ์ฒด์ ๋ํด ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ๋ ๋ฐํ๋๋ inotify_event
๊ตฌ์กฐ์ฒด์ name
ํ๋๊ฐ ๋๋ ํฐ๋ฆฌ ๋ด์์ ํ์ผ์ ์ด๋ฆ์ ๋ํ๋ธ๋ค.
์ ์ด๋ฒคํธ ๋ชจ๋์ ํด๋นํ๋ ๋นํธ ๋ง์คํฌ๋ก IN_ALL_EVENTS
๋งคํฌ๋ก๊ฐ ์ ์๋ผ ์๋ค. inotify_add_watch(2)๋ฅผ ํธ์ถํ ๋ ๊ทธ ๋งคํฌ๋ก๋ฅผ mask
์ธ์๋ก ์ธ ์ ์๋ค.
ํธ์๋ฅผ ์ํ ๋งคํฌ๋ก๊ฐ ๋ ๊ฐ์ง ๋ ์ ์๋ผ ์๋ค.
IN_MOVE
-
IN_MOVED_FROM | IN_MOVED_TO
์ ๊ฐ์. IN_CLOSE
-
IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
์ ๊ฐ์.
inotify_add_watch(2)๋ฅผ ํธ์ถํ ๋ mask
์ธ์์ ๋ค์ ๋นํธ๋ค์ ์ถ๊ฐ๋ก ์ง์ ํ ์ ์๋ค.
-
IN_DONT_FOLLOW
(๋ฆฌ๋ ์ค 2.6.16๋ถํฐ) -
pathname
์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ์ด๋ฉด ์ญ์ฐธ์กฐ๋ฅผ ํ์ง ์๋๋ค. -
IN_EXCL_UNLINK
(๋ฆฌ๋ ์ค 2.6.36๋ถํฐ) - ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ํฐ๋ฆฌ์ ์์๋ค์ ๋ํด ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ ๋๋ ๊ทธ ๋๋ ํฐ๋ฆฌ์์ ์์๋ค์ ๋งํฌ ์ ๊ฑฐ(unlink)ํ ํ์๋ ์์๋ค์ ๋ํ ์ด๋ฒคํธ๊ฐ ์์ฑ๋๋ค. ์ด๋ค ์์ฉ์์๋ (๊ฐ๋ น ์ฌ๋ฌ ์์ฉ๋ค์ด ์์ ํ์ผ์ ๋ง๋ค๊ณ ๊ทธ ์ด๋ฆ์ ์ฆ์ ๋งํฌ ์ ๊ฑฐํ๋
/tmp
๋ฅผ ๊ฐ์ํ ๋) ์ด๋ก ์ธํด ๊ด์ฌ ์๋ ์ด๋ฒคํธ๊ฐ ๋งค์ฐ ๋ง์ด ์๊ฒจ๋ ์ ์๋ค.IN_EXCL_UNLINK
๋ฅผ ์ง์ ํด์ ๊ธฐ๋ณธ ๋์์ ๋ฐ๊พธ๋ฉด ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ์์ ์์์ด ๋งํฌ ์ ๊ฑฐ๋ ํ์๋ ์ด๋ฒคํธ๊ฐ ์์ฑ๋์ง ์๋๋ค. IN_MASK_ADD
-
pathname
์ ๋์ํ๋ ํ์ผ ์์คํ ๊ฐ์ฒด์ ๋ํด ๊ฐ์ ์ธ์คํด์ค๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ (๋ง์คํฌ๋ฅผ ๊ต์ฒดํ๋ ๊ฒ ์๋๋ผ) ๊ฐ์ ๋ง์คํฌ์mask
์ ์ด๋ฒคํธ๋ค์ ์ถ๊ฐ(OR)ํ๋ค.IN_MASK_CREATE
๋ ์ง์ ๋ผ ์์ผ๋ฉดEINVAL
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. IN_ONESHOT
-
pathname
์ ๋์ํ๋ ํ์ผ ์์คํ ๊ฐ์ฒด์์ ์ด๋ฒคํธ๋ฅผ ํ ๊ฐ๋ง ๊ฐ์ํ ๋ค์ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ๋ชฉ๋ก์์ ์ ๊ฑฐํ๋ค. -
IN_ONLYDIR
(๋ฆฌ๋ ์ค 2.6.15๋ถํฐ) -
pathname
์ด ๋๋ ํฐ๋ฆฌ์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ์ํ๋ค.pathname
์ด ๋๋ ํฐ๋ฆฌ๊ฐ ์๋๋ฉดENOTDIR
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ด์ฉํ๋ฉด ๊ฒฝ์ ๋ฌธ์ ๊ฐ ์๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋์์ด ๋๋ ํฐ๋ฆฌ์์ ๋ณด์ฅํ ์ ์๋ค. -
IN_MASK_CREATE
(๋ฆฌ๋ ์ค 4.18๋ถํฐ) -
pathname
์ ์ฐ๊ด๋ ๊ฐ์ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ์ํ๋ค.pathname
์ ์ด๋ฏธ ๊ฐ์ํ๊ณ ์์ผ๋ฉดEEXIST
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.์ด ํ๋๊ทธ๋ฅผ ์ด์ฉํ๋ฉด ์์ฉ์์ ์ ๊ฐ์ ํญ๋ชฉ์ด ๊ธฐ์กด ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ฒ ํ ์ ์๋ค. ๊ทธ๊ฒ ์ ์ฉํ ๊ฑด ์ฌ๋ฌ ๊ฒฝ๋ก๊ฐ ๊ฐ์ ์์ด๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ํ๋๊ทธ ์์ด inotify_add_watch(2)๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ฉด ๊ธฐ์กด ๊ฐ์ ๋ง์คํฌ๋ฅผ ๋ง๊ฐ๋จ๋ฆด ์ ์๋ค.
read(2)
๋ก ๋ฐ๋ mask
ํ๋์ ๋ค์ ๋นํธ๋ค์ด ์ค์ ๋ผ ์์ ์ ์๋ค.
IN_IGNORED
- ๊ฐ์ ๋์์ด ๋ช ์์ ์ผ๋ก(inotify_rm_watch(2)) ๋๋ ์๋์ผ๋ก(ํ์ผ์ด ์ญ์ ๋๊ฑฐ๋ ํ์ผ ์์คํ ์ด ๋ง์ดํธ ํด์ ๋์) ์ ๊ฑฐ๋์๋ค. BUGS๋ ์ฐธ๊ณ .
IN_ISDIR
- ์ด ์ด๋ฒคํธ์ ๋์์ด ๋๋ ํฐ๋ฆฌ๋ค.
IN_Q_OVERFLOW
- ์ด๋ฒคํธ ํ๊ฐ ๋์ณค๋ค. (์ด ์ด๋ฒคํธ์์
wd
๊ฐ -1์.) IN_UNMOUNT
- ๊ฐ์ ๋์ ๊ฐ์ฒด๋ฅผ ๋ด์ ํ์ผ ์์คํ
์ด ๋ง์ดํธ ํด์ ๋์๋ค. ๋๋ถ์ด ๊ฐ์ ๋์คํฌ๋ฆฝํฐ์ ๋ํด
IN_IGNORED
์ด๋ฒคํธ๊ฐ ์ด์ด์ ์์ฑ๋ ๊ฒ์ด๋ค.
์์ฉ์์ ๋๋ ํฐ๋ฆฌ dir
๊ณผ ํ์ผ dir/myfile
์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ๋ ค ํ๋ค๊ณ ํ์. ์๋ ์๋ ๊ทธ ๋ ๊ฐ์ฒด์ ๋ํด ์์ฑ๋ ๋ช๋ช ์ด๋ฒคํธ๋ฅผ ๋ณด์ฌ ์ค๋ค.
fd = open("dir/myfile", O_RDWR);
-
dir
๊ณผdir/myfile
๋ชจ๋์IN_OPEN
์ด๋ฒคํธ ์์ฑ. read(fd, buf, count);
-
dir
๊ณผdir/myfile
๋ชจ๋์IN_ACCESS
์ด๋ฒคํธ ์์ฑ. write(fd, buf, count);
-
dir
๊ณผdir/myfile
๋ชจ๋์IN_MODIFY
์ด๋ฒคํธ ์์ฑ. fchmod(fd, mode);
-
dir
๊ณผdir/myfile
๋ชจ๋์IN_ATTRIB
์ด๋ฒคํธ ์์ฑ. close(fd);
-
dir
๊ณผdir/myfile
๋ชจ๋์IN_CLOSE_WRITE
์ด๋ฒคํธ ์์ฑ.
์์ฉ์์ ๋๋ ํฐ๋ฆฌ dir1
๊ณผ dir2
, ํ์ผ dir1/myfile
์ ๊ฐ์ํ๋ ค ํ๋ค๊ณ ํ์. ๋ค์ ์๋ ์์ฑ๋ ์ ์๋ ๋ช๋ช ์ด๋ฒคํธ๋ฅผ ๋ณด์ฌ ์ค๋ค.
link("dir1/myfile", "dir2/new");
-
myfile
์IN_ATTRIB
์ด๋ฒคํธ์dir2
์IN_CREATE
์ด๋ฒคํธ ์์ฑ. rename("dir1/myfile", "dir2/myfile");
-
dir1
์IN_MOVED_FROM
์ด๋ฒคํธ,dir2
์IN_MOVED_TO
์ด๋ฒคํธ,myfile
์IN_MOVE_SELF
์ด๋ฒคํธ ์์ฑ.IN_MOVED_FROM
์ด๋ฒคํธ์IN_MOVED_TO
์ด๋ฒคํธ์cookie
๊ฐ์ด ๊ฐ๊ฒ ๋๋ค.
dir1/xx
์ dir2/yy
๊ฐ ๊ฐ์ ํ์ผ์ ๋ํ (์ ์ดํ) ๋งํฌ์ด๋ฉฐ ์์ฉ์์ dir1
, dir2
, dir1/xx
, dir2/yy
๋ฅผ ๊ฐ์ํ๋ ค ํ๋ค๊ณ ํ์. ๋ค์ ํธ์ถ๋ค์ ์ฐจ๋ก๋ก ์คํํ๋ฉด ๋ค์ ์ด๋ฒคํธ๋ค์ด ์์ฑ๋๋ค.
unlink("dir2/yy");
-
xx
์ (๋งํฌ ์นด์ดํธ๊ฐ ๋ฐ๋๋ฏ๋ก)IN_ATTRIB
์ด๋ฒคํธ์dir2
์IN_DELETE
์ด๋ฒคํธ ์์ฑ. unlink("dir1/xx");
-
xx
์IN_ATTRIB
,IN_DELETE_SELF
,IN_IGNORED
์ด๋ฒคํธ, ๊ทธ๋ฆฌ๊ณdir1
์IN_DELETE
์ด๋ฒคํธ ์์ฑ.
์์ฉ์์ ๋๋ ํฐ๋ฆฌ dir
๊ณผ (๋น) ๋๋ ํฐ๋ฆฌ dir/subdir
์ ๊ฐ์ํ๋ ค ํ๋ค๊ณ ํ์. ๋ค์ ์๋ ์์ฑ๋ ์ ์๋ ๋ช๋ช ์ด๋ฒคํธ๋ฅผ ๋ณด์ฌ ์ค๋ค.
mkdir("dir/new", mode);
-
dir
์IN_CREATE | IN_ISDIR
์ด๋ฒคํธ ์์ฑ. rmdir("dir/subdir");
-
subdir
์IN_DELETE_SELF
๋ฐIN_IGNORED
์ด๋ฒคํธ, ๊ทธ๋ฆฌ๊ณdir
์IN_DELETE | IN_ISDIR
์ด๋ฒคํธ ์์ฑ.
๋ค์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด inotify์์ ์ฐ๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ ํํ ์ ์๋ค.
/proc/sys/fs/inotify/max_queued_events
- ์์ฉ์์ inotify_init(2)์ ํธ์ถํ ๋ ์ด ํ์ผ์ ๊ฐ์ ์ฌ์ฉํด ํด๋น inotify ์ธ์คํด์ค ํ์ ๋ค์ด๊ฐ ์ ์๋ ์ด๋ฒคํธ ์์ ์ํ์ ์ ํ๋ค. ์ด ์ ํ์ ์ด๊ณผํ๋ ์ด๋ฒคํธ๋ค์ ๋ฒ๋ ค์ง๋ ํญ์
IN_Q_OVERFLOW
์ด๋ฒคํธ๊ฐ ์์ฑ๋๋ค. /proc/sys/fs/inotify/max_user_instances
- ์ค์ ์ฌ์ฉ์ ID๋ณ๋ก ๋ง๋ค ์ ์๋ inotify ์ธ์คํด์ค ์์ ์ํ์ ์ง์ ํ๋ค.
/proc/sys/fs/inotify/max_user_watches
- ์ค์ ์ฌ์ฉ์ ID๋ณ๋ก ๋ง๋ค ์ ์๋ ๊ฐ์ ํญ๋ชฉ ์์ ์ํ์ ์ง์ ํ๋ค.
๋ฆฌ๋
์ค ์ปค๋ 2.6.13์ผ๋ก inotify๊ฐ ๋ณํฉ๋์๋ค. glibc ๋ฒ์ 2.4์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค๊ฐ ์ถ๊ฐ๋์๋ค. (IN_DONT_FOLLOW
, IN_MASK_ADD
, IN_ONLYDIR
์ glibc ๋ฒ์ 2.5์์ ์ถ๊ฐ๋์๋ค.)
inotify API๋ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ค.
select(2), poll(2), epoll(7)๋ก inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฐ์ํ ์ ์๋ค.
๋ฆฌ๋
์ค 2.6.25๋ถํฐ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์๊ทธ๋ ์ฃผ๋ I/O ์๋ฆผ์ ์ฌ์ฉํ ์ ์๋ค. fcntl(2)์ F_SETFL
(O_ASYNC
ํ๋๊ทธ ์ค์ ), F_SETOWN
, F_SETSIG
์ค๋ช
์ ๋ณด๋ผ. ์๊ทธ๋ ํธ๋ค๋ฌ์๊ฒ ์ ๋ฌ๋๋ siginfo_t
๊ตฌ์กฐ์ฒด(sigaction(2)์์ ์ค๋ช
)์์ si_fd
๊ฐ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ก ์ค์ ๋ผ ์๊ณ , si_signo
๊ฐ ์๊ทธ๋ ๋ฒํธ๋ก ์ค์ ๋ผ ์๊ณ , si_code
๊ฐ POLL_IN
์ผ๋ก ์ค์ ๋ผ ์๊ณ , si_band
์ POLLIN
์ด ์ค์ ๋ผ ์๋ค.
inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ฐ๋ฌ์ ์๊ฒจ๋ inotify ์ด๋ฒคํธ๋ค์ด ๋์ผํ (wd
, mask
, cookie
, name
์ด ๊ฐ์) ๊ฒฝ์ฐ ์ด์ ์ด๋ฒคํธ๊ฐ ์์ง ์ฝํ์ง ์์์ผ๋ฉด ํ ์ด๋ฒคํธ๋ก ๋ณํฉํ๋ค. (ํ์ง๋ง BUGS ์ฐธ๊ณ .) ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฒคํธ ํ์ ํ์ํ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์์ด ์ค๊ธฐ๋ ํ์ง๋ง ์์ฉ์์ inotify๋ฅผ ์ด์ฉํด ํ์ผ ์ด๋ฒคํธ ์๋ฅผ ์ ํํ ์
์ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค.
inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ฝ์ด์ ๋ฐํ๋๋ ์ด๋ฒคํธ๋ค์ ์์ ์๋ ํ๋ฅผ ํ์ฑํ๋ค. ๊ทธ๋์ ์๋ฅผ ๋ค์ด ํ ๋๋ ํฐ๋ฆฌ์์ ๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ฆ์ ๋ฐ๊ฟ ๋ ์ด๋ฒคํธ๋ค์ด inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์์ ์ ํํ ์์๋ก ์๊ฒจ๋๋ค๊ณ ๋ณด์ฅ๋๋ค.
inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๊ฐ์ ์ค์ธ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ชฉ๋ก์ ํ๋ก์ธ์ค์ /proc/[pid]/fdinfo
๋๋ ํฐ๋ฆฌ ๋ด inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ํญ๋ชฉ์ ํตํด ๋ณผ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ proc(5) ์ฐธ๊ณ . FIONREAD
ioctl(2)
์ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ฝ์ ์ ์๋ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค.
inotify API๋ inotify ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ ์ฌ์ฉ์๋ ํ๋ก์ธ์ค์ ๋ํด์ ์ด๋ค ์ ๋ณด๋ ์ ๊ณตํ์ง ์๋๋ค. ํนํ inotify๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ๊ณ ์๋ ํ๋ก์ธ์ค ์์ฒด์์ ์ ๋ฐํ ์ด๋ฒคํธ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๋ฐํ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ณํ ์์ฌ์ด ๋ฐฉ๋ฒ์ด ์๋ค.
inotify๋ ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋ก๊ทธ๋จ์ด ํ์ผ ์์คํ
API๋ฅผ ํตํด ์ ๋ฐํ ์ด๋ฒคํธ๋ง์ ๋ณด๊ณ ํ๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ ํ์ผ ์์คํ
์์์ ์ผ์ด๋๋ ์๊ฒฉ ์ด๋ฒคํธ๋ ์ก์ง ๋ชปํ๋ค. (๊ทธ๋ฐ ์ด๋ฒคํธ๋ฅผ ์ก์ผ๋ ค๋ฉด ํ์ผ ์์คํ
ํด๋ง์ผ๋ก ๋๋์๊ฐ์ผ ํ๋ค.) ๋ํ /proc
, /sys
, /dev/pts
๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ ์์คํ
๋ค์ inotify๋ก ๊ฐ์ํ ์ ์๋ค.
inotify API๋ mmap(2), msync(2), munmap(2) ๋๋ฌธ์ ์ผ์ด๋ ์ ์๋ ํ์ผ ์ ๊ทผ ๋ฐ ๋ณ๊ฒฝ์ ๋ํด ์๋ ค ์ฃผ์ง ์๋๋ค.
inotify API์์๋ ์ํฅ ๋ฐ๋ ํ์ผ๋ค์ ํ์ผ๋ช ์ผ๋ก ๊ตฌ๋ณํด ์ค๋ค. ํ์ง๋ง ์์ฉ์์ inotify ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ์ ๊ทธ ํ์ผ๋ช ์ด ์ด๋ฏธ ์ญ์ ๋ด์ง ๋ณ๊ฒฝ๋์์ ์๋ ์๋ค.
inotify API์์๋ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ์๋ณํ๋ค. (ํ์ํ ๊ฒฝ์ฐ) ๊ฐ์ ๋์คํฌ๋ฆฝํฐ์ ๊ฒฝ๋ก๋ช ์ฌ์ด ๋งคํ์ ์บ์ฑ ํ๋ ๊ฑด ์์ฉ์ ๋ชซ์ด๋ค. ๋๋ ํฐ๋ฆฌ ์ด๋ฆ์ด ๋ฐ๋๋ฉด ์บ์ฑ ๋ ์ฌ๋ฌ ๊ฒฝ๋ก๋ช ์ด ์ํฅ์ ๋ฐ์ ์ ์๋ค๋ ์ ์ ์ ์ํ๋ผ.
inotify์์์ ๋๋ ํฐ๋ฆฌ ๊ฐ์๋ ์ฌ๊ท์ ์ด์ง ์๋ค. ๋๋ ํฐ๋ฆฌ ์๋ ์๋ธ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ๋ ค๋ฉด ๊ฐ์ ํญ๋ชฉ์ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ปค๋ค๋ ๋๋ ํฐ๋ฆฌ ํธ๋ฆฌ์์๋ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค.
๋๋ ํฐ๋ฆฌ ์๋ธํธ๋ฆฌ ์ ์ฒด๋ฅผ ๊ฐ์ ์ค์ด๋ฉฐ ๊ทธ ํธ๋ฆฌ ๋ด์ ์ ์๋ธ๋๋ ํฐ๋ฆฌ๊ฐ ์๊ธฐ๊ฑฐ๋ ๊ธฐ์กด ๋๋ ํฐ๋ฆฌ๊ฐ ๊ทธ ํธ๋ฆฌ ์์ผ๋ก ์ด๋ฆ์ด ๋ฐ๋๋ ๊ฒฝ์ฐ์ ๊ทธ ์ ์๋ธ๋๋ ํฐ๋ฆฌ์ ๋ํ ๊ฐ์ ํญ๋ชฉ์ ๋ง๋๋ ์์ ์ ๊ทธ ์์ ์ด๋ฏธ ์ ํ์ผ๋ค์ด (๊ทธ๋ฆฌ๊ณ ์๋ธ๋๋ ํฐ๋ฆฌ๋ค์ด) ์กด์ฌํ ์๋ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ํญ๋ชฉ์ ์ถ๊ฐํ ์งํ์ ๊ทธ ์๋ธ๋๋ ํฐ๋ฆฌ ๋ด์ฉ์ ํ์ด๋ด์ผ ํ ์๋ (๊ทธ๋ฆฌ๊ณ ์ํ๋ค๋ฉด ๊ทธ ์์ ์๋ธ๋๋ ํฐ๋ฆฌ๋ค์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ๊ฐ์ ํญ๋ชฉ์ ์ถ๊ฐํ ์๋) ์๋ค.
์ด๋ฒคํธ ํ๊ฐ ๋์น ์ ์์์ ์ ์ํ๋ผ. ์ด ๊ฒฝ์ฐ ์ด๋ฒคํธ๊ฐ ์ ์ค๋๋ค. ๊ฒฌ๊ณ ํ ์์ฉ์ด๋ผ๋ฉด ์ด๋ฒคํธ ์ ์ค ๊ฐ๋ฅ์ฑ์ ์ฐ์ํ๊ฒ ๋ค๋ค์ผ ํ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์์ฉ ์บ์์ ์ผ๋ถ ๋ด์ง ์ ์ฒด๋ฅผ ์ฌ๊ตฌ์ถํด์ผ ํ ์๋ ์๋ค. (๊ฐ๋จํ์ง๋ง ๋น์ฉ์ด ํด ์ ์๋ ๋ฐฉ์ ํ๋๋ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๊ณ , ์บ์๋ฅผ ๋น์ฐ๊ณ , ์ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ง๋ค๊ณ ๋์ ๊ฐ์ํ ๊ฐ์ฒด๋ค์ ๋ํ ๊ฐ์ ํญ๋ชฉ๊ณผ ์บ์ ํญ๋ชฉ์ ๋ค์ ์์ฑํ๋ ๊ฒ์ด๋ค.)
๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ์์ ์ด๋ค ํ์ผ ์์คํ ์ ๋ง์ดํธ ํ๋ ๊ฒฝ์ฐ ์ด๋ค ์ด๋ฒคํธ๋ ์์ฑ๋์ง ์์ผ๋ฉฐ ๊ทธ ์ ๋ง์ดํธ ์ง์ ๋ฐ๋ก ์๋ ๊ฐ์ฒด๋ค์ ๋ํด ์ด๋ค ์ด๋ฒคํธ๋ ์์ฑ๋์ง ์๋๋ค. ์ดํ์ ๊ทธ ํ์ผ ์์คํ ์ด ๋ง์ดํธ ํด์ ๋๋ฉด ๊ทธ ๋ค์ ๊ฑฐ๊ธฐ ๋ด๊ธด ๋๋ ํฐ๋ฆฌ์ ๊ฐ์ฒด๋ค์ ๋ํ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ๊ฒ์ด๋ค.
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ rename(2)์ด ์์ฑํ๋ IN_MOVED_FROM
๋ฐ IN_MOVED_TO
์ด๋ฒคํธ๋ฅผ ๊ณต์ ์ฟ ํค ๊ฐ์ ํตํด ์ง์ ๋ง์ถ ์ ์๋ค. ํ์ง๋ง ์ง์ ๋ง์ถ๋ ์์
์ ๋ช ๊ฐ์ง ์ด๋ ค์ด ์ ์ด ์๋ค.
inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ฝ์ด ๋ค์ผ ๋ ์ด ๋ ์ด๋ฒคํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ์์ผ๋ก ๋์จ๋ค. ํ์ง๋ง ๊ทธ๊ฒ ๋ณด์ฅ๋ผ ์๋ ๊ฑด ์๋๋ค. ์ด๋ค ๊ฐ์ ๋์ ๊ฐ์ฒด์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ๋ ๊ฒฝ์ฐ์๋ (๋๋ฌผ์ง๋ง) IN_MOVED_FROM
๋ฐ IN_MOVED_TO
์ด๋ฒคํธ ์ฌ์ด์ ์์์ ๋ค๋ฅธ ์ด๋ฒคํธ๋ค์ด ๋ฑ์ฅํ ์ ์๋ค. ๋ํ ๊ทธ ์ด๋ฒคํธ ์์ด ํ์ ์์์ ์ผ๋ก ์ฝ์
๋๋ค๊ณ ๋ณด์ฅ๋์ง ์๋๋ค. ์ฆ IN_MOVED_FROM
์ ๋ฑ์ฅํ์ง๋ง IN_MOVED_TO
๋ ์๋ ์งง์ ๊ธฐ๊ฐ์ด ์์ ์ ์๋ค.
๊ทธ๋์ rename(2)์ผ๋ก ์์ฑ๋๋ IN_MOVED_FROM
๋ฐ IN_MOVED_TO
์ด๋ฒคํธ์ ์ง์ ๋ง์ถ๋ ๋ฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒฝ์ ์์๊ฐ ์๋ค. (๊ฒ๋ค๊ฐ ๊ฐ์ฒด์ ์ด๋ฆ์ด ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๋ฐ์ผ๋ก ๋ฐ๋๋ฉด IN_MOVED_TO
์ด๋ฒคํธ๊ฐ ์์ ์๋ ์๋ค.) ๊ฒฝํ์ ์ ๊ทผ ๋ฐฉ์(๊ฐ๋ น ์ด๋ฒคํธ๊ฐ ํญ์ ์ฐ์๋ผ ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ)์ ์ฐ๋ฉด ๋๋ถ๋ถ ๊ฒฝ์ฐ์์ ์ง์ ๋ง์ถ ์ ์์ง๋ง ๋ถ๊ฐํผํ๊ฒ ์ผ๋ถ ๊ฒฝ์ฐ๋ฅผ ๋์น๊ฒ ๋์ด ์์ฉ์์ ์ด๋ค IN_MOVED_FROM
๋ฐ IN_MOVED_TO
์ด๋ฒคํธ ์์ด ์๋ก ๋ฌด๊ดํ๋ค๊ณ ์ธ์ํ๊ฒ ๋๋ค. ๊ทธ๋์ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ๊ธฐํ๊ณ ๋ค์ ๋ง๋ค๋ฉด ๊ทธ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ฏธ์ฒ๋ฆฌ ์ด๋ฒคํธ์ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ์ ์ผ์นํ์ง ์๊ฒ ๋๋ค. (์ด๋ฐ ๊ฒฝ์ฐ์๋ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ค์ ๋ง๋ค๊ณ ์บ์๋ฅผ ์ฌ๊ตฌ์ถํ๋ ๊ฒ ๋์์ด ๋ ์ ์๋ค.)
๋ํ ์์ฉ์์๋ ์ด๋ฒ read(2)
ํธ์ถ์ด ๋ฐํํ๋ ๋ฒํผ์ IN_MOVED_FROM
์ด๋ฒคํธ๊น์ง๋ง ๋ค์ด๊ฐ ์ ์์ด์ ๋ธ๋ฆฐ IN_MOVED_TO
์ด๋ฒคํธ๋ฅผ ๋ค์ read(2)
๋ก๋ง ์ฝ์ ์ ์์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ํด์ผ ํ๋ค. ์ด๋ (์์) ํ์์์์ ์ฃผ๋ ๊ฒ ์ข์๋ฐ, IN_MOVED_FROM
-IN_MOVED_TO
์ด๋ฒคํธ ์ ์ฝ์
์ด ์์์ ์ด์ง ์์ผ๋ฉฐ IN_MOVED_TO
์ด๋ฒคํธ๊ฐ ์์ ๊ฐ๋ฅ์ฑ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ๋
์ค 3.19 ์ ์์ fallocate(2)๊ฐ inotify ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์์๋ค. ๋ฆฌ๋
์ค 3.19๋ถํฐ fallocate(2) ํธ์ถ์ด IN_MODIFY
์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ค.
์ปค๋ 2.6.16 ์ ์์ mask
ํ๋๊ทธ IN_ONESHOT
์ด ๋์ํ์ง ์๋๋ค.
์๋ ์ค๊ณ์ ๊ตฌํ์์๋ IN_ONESHOT
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ฒคํธ ํ์ ๊ฐ์ ํญ๋ชฉ์ด ์์ด์ง ๋ IN_IGNORED
์ด๋ฒคํธ๊ฐ ์์ฑ๋์ง ์์๋ค. ํ์ง๋ง ๋ค๋ฅธ ๋ณ๊ฒฝ ๋ด์ฉ๋ค์ ์๋์น ์์ ํจ๊ณผ ๋๋ฌธ์ ๋ฆฌ๋
์ค 2.6.36๋ถํฐ๋ ์ด ๊ฒฝ์ฐ์ IN_IGNORED
์ด๋ฒคํธ๊ฐ ์์ฑ๋๋ค.
์ปค๋ 2.6.25 ์ ์์ ์ฐ์ํ ๋์ผ ์ด๋ฒคํธ(์ฆ ์ค๋๋ ์ชฝ์ ์์ง ์ฝ์ง ์์์ผ๋ฉด ํฉ์ณ์ง ์๋ ์๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ ์ด๋ฒคํธ)๋ฅผ ํฉ์น๊ธฐ ์ํ ์ปค๋ ์ฝ๋์์ ๊ฐ์ฅ ์ต๊ทผ ์ด๋ฒคํธ์ ๊ฐ์ฅ ์ค๋๋ ์ ์ฝ์ ์ด๋ฒคํธ๋ฅผ ํฉ์น ์ ์๋์ง ํ์ธํ๋ค.
inotify_rm_watch(2) ํธ์ถ๋ก (๋๋ ๊ฐ์ ๋์ ํ์ผ์ด ์ญ์ ๋๊ฑฐ๋ ํ์ผ์ ๋ด์ ํ์ผ ์์คํ
์ด ๋ง์ดํธ ํด์ ๋ผ์) ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ ๊ฑฐ๋ ๋ ๊ทธ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ์ ์ฝ์ ๋ฏธ์ฒ๋ฆฌ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉด ๊ณ์ ์ฝ์ ์ ์๋ ์ํ๋ก ๋จ๋๋ค. ์ด์ด์ inotify_add_watch(2)๋ก ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ๋ฉด ์ปค๋์์๋ ๊ฐ๋ฅํ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ ๋ฒ์(0์์ INT_MAX
๊น์ง)๋ฅผ ์ฐจ๋ก๋ก ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ ํด ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ ๋ ๊ทธ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ์ ์ฝ์ ๋ฏธ์ฒ๋ฆฌ ์ด๋ฒคํธ๊ฐ inotify ํ์ ์๋์ง ํ์ธํ์ง ์๋๋ค. ๊ทธ๋์ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ์ ์ด์ ์ฌ์ฉ ๋ ์ ์ฝ์ ๋ฏธ์ฒ๋ฆฌ ์ด๋ฒคํธ๊ฐ ์กด์ฌํ๋๋ฐ๋ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ฌํ ๋น๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ์์ฉ์์ ๊ทธ ์ด๋ฒคํธ๋ค์ ์ฝ์ด์๋ ์๋ก ์ฌ์ฌ์ฉํ๋ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ์ ์ฐ๊ณ๋ ํ์ผ์ ์ํ ์ด๋ฒคํธ๋ก ํด์ํ๊ฒ ๋ ์ ์๋ค. ์ค์ง์ ์ผ๋ก ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๊ทนํ ๋ฎ์๋ฐ, ์์ฉ์์ INT_MAX
๊ฐ์ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฉฐ ํ์ ์ ์ฝ์ ์ด๋ฒคํธ๋ฅผ ๋จ๊ฒจ๋ ์ฑ๋ก ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํด์ ํ๋ค๊ฐ ๊ทธ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ ์ด์ ๋ก, ๊ทธ๋ฆฌ๊ณ ์คํ๊ฒฝ ์์ฉ์์ ๊ทธ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค๋ ๋ณด๊ณ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋
์ค 3.15 ๊ธฐ์ค์ผ๋ก ์ด ์ ์ฌ์ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํ ์ด๋ค ์ปค๋ ๋ณ๊ฒฝ ์์
๋ ์ด๋ค์ง์ง ์์๋ค.
๋ค์ ํ๋ก๊ทธ๋จ์ inotify API ์ฌ์ฉ ๋ฐฉ์์ ๋ณด์ฌ ์ค๋ค. ๋ช
๋ นํ ์ธ์๋ก ๋ฐ์ ๋๋ ํฐ๋ฆฌ๋ค์ ํ์๋ฅผ ํ๊ณ IN_OPEN
, IN_CLOSE_NOWRITE
, IN_CLOSE_WRITE
์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
๋ค์ ์ถ๋ ฅ์ ํ์ผ /home/user/temp/foo
๋ฅผ ํธ์งํ๊ณ ๋๋ ํฐ๋ฆฌ /tmp
๋ฅผ ๋์ดํ๋ฉด์ ๊ธฐ๋กํ ๊ฒ์ด๋ค. ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ด๊ธฐ ์ ์ IN_OPEN
์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ค. ํ์ผ์ ๋ซ์ ํ์ IN_CLOSE_WRITE
์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ค. ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ซ์ ํ์ IN_CLOSE_NOWRITE
์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ค. ์ฌ์ฉ์๊ฐ ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ด ๋๋๋ค.
$ ./a.out /tmp /home/user/temp
Press enter key to terminate.
Listening for events.
IN_OPEN: /home/user/temp/foo [file]
IN_CLOSE_WRITE: /home/user/temp/foo [file]
IN_OPEN: /tmp/ [directory]
IN_CLOSE_NOWRITE: /tmp/ [directory]
Listening for events stopped.
#include <errno.h>
#include <poll.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <unistd.h>
/* ํ์ผ ๋์คํฌ๋ฆฝํฐ 'fd'์์ ๊ฐ์ฉ inotify ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ์ฝ์ด ๋ค์ธ๋ค.
wd๋ argv ๋ด ๋๋ ํฐ๋ฆฌ๋ค์ ๋ํ ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ค์ ํ
์ด๋ธ์ด๋ค.
argc๋ wd ๋ฐ argv์ ๊ธธ์ด์ด๋ค.
argv๋ ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ๋ค์ ๋ชฉ๋ก์ด๋ค.
wd ๋ฐ argv์ 0๋ฒ ํญ๋ชฉ์ ์ฐ์ง ์๋๋ค. */
static void
handle_events(int fd, int *wd, int argc, char *argv[])
{
/* ์ด๋ค ์์คํ
์์๋ ์ฌ๋ฐ๋ก ์ ๋ ฌ๋ผ ์์ง ์์ผ๋ฉด ์ ์ ๋ณ์๋ฅผ
์ฝ์ ์ ์๋ค. ๋ค๋ฅธ ์์คํ
์์๋ ์ ๋ ฌ์ด ์ ๋ง์ผ๋ฉด ์ฑ๋ฅ์ด
๋จ์ด์ง ์ ์๋ค. ๋ฐ๋ผ์ inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ฝ์ ๋
์ฐ๋ ๋ฒํผ์ ์ ๋ ฌ์ด struct inotify_event์ ๊ฐ์์ผ ํ๋ค. */
char buf[4096]
__attribute__ ((aligned(__alignof__(struct inotify_event))));
const struct inotify_event *event;
int i;
ssize_t len;
char *ptr;
/* inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ด๋ฒคํธ๋ฅผ ์ฝ์ ์ ์๋ ๋์ ๋ฐ๋ณต. */
for (;;) {
/* ์ด๋ฒคํธ ์ฝ๊ธฐ */
len = read(fd, buf, sizeof buf);
if (len == -1 && errno != EAGAIN) {
perror("read");
exit(EXIT_FAILURE);
}
/* ๋
ผ๋ธ๋กํน read()์์ ์ฝ์ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉด -1์ ๋ฐํํ๋ฉฐ
errno๋ฅผ EAGAIN์ผ๋ก ์ค์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฃจํ์์ ๋น ์ ธ๋๊ฐ๋ค. */
if (len <= 0)
break;
/* ๋ฒํผ ๋ด ๋ชจ๋ ์ด๋ฒคํธ ๋๊ธฐ */
for (ptr = buf; ptr < buf + len;
ptr += sizeof(struct inotify_event) + event->len) {
event = (const struct inotify_event *) ptr;
/* ์ด๋ฒคํธ ํ์
์ฐ๊ธฐ */
if (event->mask & IN_OPEN)
printf("IN_OPEN: ");
if (event->mask & IN_CLOSE_NOWRITE)
printf("IN_CLOSE_NOWRITE: ");
if (event->mask & IN_CLOSE_WRITE)
printf("IN_CLOSE_WRITE: ");
/* ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ ์ฐ๊ธฐ */
for (i = 1; i < argc; ++i) {
if (wd[i] == event->wd) {
printf("%s/", argv[i]);
break;
}
}
/* ํ์ผ ์ด๋ฆ ์ฐ๊ธฐ */
if (event->len)
printf("%s", event->name);
/* ํ์ผ ์์คํ
๊ฐ์ฒด ์ข
๋ฅ ์ฐ๊ธฐ */
if (event->mask & IN_ISDIR)
printf(" [directory]\n");
else
printf(" [file]\n");
}
}
}
int
main(int argc, char *argv[])
{
char buf;
int fd, i, poll_num;
int *wd;
nfds_t nfds;
struct pollfd fds[2];
if (argc < 2) {
printf("Usage: %s PATH [PATH ...]\n", argv[0]);
exit(EXIT_FAILURE);
}
printf("Press ENTER key to terminate.\n");
/* inotify API ์ ๊ทผ์ ์ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ง๋ค๊ธฐ */
fd = inotify_init1(IN_NONBLOCK);
if (fd == -1) {
perror("inotify_init1");
exit(EXIT_FAILURE);
}
/* ๊ฐ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น */
wd = calloc(argc, sizeof(int));
if (wd == NULL) {
perror("calloc");
exit(EXIT_FAILURE);
}
/* ๋๋ ํฐ๋ฆฌ์ ๋ค์ ์ด๋ฒคํธ ํ์:
- ํ์ผ ์ด๋ฆผ
- ํ์ผ ๋ซํ */
for (i = 1; i < argc; i++) {
wd[i] = inotify_add_watch(fd, argv[i],
IN_OPEN | IN_CLOSE);
if (wd[i] == -1) {
fprintf(stderr, "Cannot watch '%s'\n", argv[i]);
perror("inotify_add_watch");
exit(EXIT_FAILURE);
}
}
/* ํด๋ง ์ค๋น */
nfds = 2;
/* ์ฝ์ ์
๋ ฅ */
fds[0].fd = STDIN_FILENO;
fds[0].events = POLLIN;
/* inotify ์
๋ ฅ */
fds[1].fd = fd;
fds[1].events = POLLIN;
/* ์ด๋ฒคํธ ๋ฐ/๋๋ ํฐ๋ฏธ๋ ์
๋ ฅ ๊ธฐ๋ค๋ฆฌ๊ธฐ */
printf("Listening for events.\n");
while (1) {
poll_num = poll(fds, nfds, -1);
if (poll_num == -1) {
if (errno == EINTR)
continue;
perror("poll");
exit(EXIT_FAILURE);
}
if (poll_num > 0) {
if (fds[0].revents & POLLIN) {
/* ์ฝ์ ์
๋ ฅ ์์. stdin ๋น์ฐ๊ณ ๋๋ด๊ธฐ */
while (read(STDIN_FILENO, &buf, 1) > 0 && buf != '\n')
continue;
break;
}
if (fds[1].revents & POLLIN) {
/* inotify ์ด๋ฒคํธ ์์ */
handle_events(fd, wd, argc, argv);
}
}
}
printf("Listening for events stopped.\n");
/* inotify ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ๊ธฐ */
close(fd);
free(wd);
exit(EXIT_SUCCESS);
}
inotifywait(1)
, inotifywatch(1)
, inotify_add_watch(2), inotify_init(2), inotify_init1(2), inotify_rm_watch(2), read(2)
, stat(2), fanotify(7)
๋ฆฌ๋
์ค ์ปค๋ ์์ค ํธ๋ฆฌ์ Documentation/filesystems/inotify.txt
2019-03-06