inotify(7) - wariua/manpages-ko GitHub Wiki

NAME

inotify - ํŒŒ์ผ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ๊ฐ์‹œํ•˜๊ธฐ

DESCRIPTION

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 ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ์ด๋ฒคํŠธ ์ฝ๊ธฐ

์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‘์šฉ์—์„œ๋Š” 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 ์ด๋ฒคํŠธ

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 ์ด๋ฒคํŠธ ์ƒ์„ฑ.

/proc ์ธํ„ฐํŽ˜์ด์Šค

๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด 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๋ณ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ์‹œ ํ•ญ๋ชฉ ์ˆ˜์˜ ์ƒํ•œ์„ ์ง€์ •ํ•œ๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.13์œผ๋กœ inotify๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.4์—์„œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. (IN_DONT_FOLLOW, IN_MASK_ADD, IN_ONLYDIR์€ glibc ๋ฒ„์ „ 2.5์—์„œ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.)

CONFORMING TO

inotify API๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

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() ์ด๋ฒคํŠธ ๋‹ค๋ฃจ๊ธฐ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 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 ์ด๋ฒคํŠธ๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

BUGS

๋ฆฌ๋ˆ…์Šค 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 ๊ธฐ์ค€์œผ๋กœ ์ด ์ž ์žฌ์  ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋–ค ์ปค๋„ ๋ณ€๊ฒฝ ์ž‘์—…๋„ ์ด๋ค„์ง€์ง€ ์•Š์•˜๋‹ค.

EXAMPLE

๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์€ 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);
}

SEE ALSO

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ