fanotify(7) - wariua/manpages-ko GitHub Wiki
fanotify - ํ์ผ ์์คํ ์ด๋ฒคํธ ๊ฐ์ํ๊ธฐ
fanotify API๋ฅผ ํตํด ํ์ผ ์์คํ ์ด๋ฒคํธ ์๋ฆผ์ ๋ฐ๊ณ ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ก์ฑ ์ ์๋ค. ์ฌ์ฉ๋ก๋ก๋ ๋ฐ์ด๋ฌ์ค ๊ฒ์ฌ๋ ๊ณ์ธต์ ์ ์ฅ์ ๊ด๋ฆฌ๊ฐ ์์ ์ ์๋ค. ํ์ฌ๋ ์ ํ๋ ์ข ๋ฅ์ ์ด๋ฒคํธ๋ค๋ง ์ง์ํ๋ค. ํนํ ์์ฑ, ์ญ์ , ์ด๋ ์ด๋ฒคํธ๋ฅผ ์ง์ํ์ง ์๋๋ค. (์ด ์ด๋ฒคํธ๋ค์ ์๋ ค ์ฃผ๋ API์ ๋ํ ๋ด์ฉ์ inotify(7)๋ฅผ ๋ณด๋ผ.)
inotify(7) API์ ๋น๊ตํ์๋ฉด ๋ง์ดํธ ํ ํ์ผ ์์คํ ๋ด์ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฐ์ํ ์ ์๊ณ , ์ ๊ทผ ํ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์์ฉ์์ ์ ๊ทผํ๊ธฐ ์ ์ ํ์ผ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ ๊ฐ๋ฅํ๋ค.
์ด API์์ ์ฐ๋ ์์คํ
ํธ์ถ์ fanotify_init(2), fanotify_mark(2), read(2)
, write(2)
, close(2)์ด๋ค.
fanotify_init(2) ์์คํ ํธ์ถ์ fanotify ์๋ฆผ ๊ทธ๋ฃน์ ๋ง๋ค์ด์ ์ด๊ธฐํ ํ๋ฉฐ ๊ทธ ์๋ฆผ ๊ทธ๋ฃน์ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค.
fanotify ์๋ฆผ ๊ทธ๋ฃน์ด๋ ์ปค๋ ๋ด๋ถ ๊ฐ์ฒด๋ก์ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ํ์ผ, ๋๋ ํฐ๋ฆฌ, ํ์ผ ์์คํ , ๋ง์ดํธ ์ง์ ๋ค์ ๋ชฉ๋ก์ ๊ฐ์ง๊ณ ์๋ค.
fanotify ์๋ฆผ ๊ทธ๋ฃน ๋ด์ ๊ฐ ํญ๋ชฉ๋ง๋ค ํ์(mark) ๋ง์คํฌ์ ๋ฌด์(ignore) ๋ง์คํฌ๋ผ๋ ๋ ๊ฐ์ง ๋นํธ ๋ง์คํฌ๊ฐ ์๋ค. ํ์ ๋ง์คํฌ๋ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ํ์ผ ํ๋๋ค์ ๊ท์ ํ๋ค. ๋ฌด์ ๋ง์คํฌ๋ ์ด๋ฒคํธ๊ฐ ์์ฑ๋์ง ์์ ํ๋๋ค์ ๊ท์ ํ๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๋ง์คํฌ๊ฐ ์์ด์ ์ด๋ค ํ์ผ ์์คํ ์ด๋ ๋ง์ดํธ ์ง์ , ๋๋ ํฐ๋ฆฌ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋๋ค๊ณ ํ์ํ๋ฉด์ ๋์์ ์ด๋ค ๋ง์ดํธ ์ง์ ๋ด์ง ๋๋ ํฐ๋ฆฌ ์๋์ ํน์ ๊ฐ์ฒด๋ค์ ๋ํ ์ด๋ฒคํธ๋ฅผ ๋ฌด์ํ ์ ์๋ค.
fanotify_mark(2) ์์คํ ํธ์ถ์ ์๋ฆผ ๊ทธ๋ฃน์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ, ํ์ผ ์์คํ , ๋ง์ดํธ๋ฅผ ์ถ๊ฐํ๋ฉด์ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ณด๊ณ ํด์ผ (๋๋ ๋ฌด์ํด์ผ) ํ๋์ง ์ง์ ํ๋ค. ๋๋ ๊ทธ๋ฐ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ค.
๋ฌด์ ๋ง์คํฌ๋ฅผ ์ธ ์ ์๋ ๊ฒฝ์ฐ๋ก ํ์ผ ์บ์๊ฐ ์๋ค. ํ์ผ ์บ์์์ ๊ด์ฌ ์๋ ์ด๋ฒคํธ๋ ํ์ผ์ด ๋ณ๊ฒฝ๋๊ณ ๋ซํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์บ์ฑ ๋์ ๋๋ ํฐ๋ฆฌ ๋ด์ง ๋ง์ดํธ ์ง์ ์ ๊ทธ ์ด๋ฒคํธ๋ค์ ๋ฐ๊ฒ ๋ค๊ณ ํ์ํ๋ค. ํ์ผ์ด ๋ณ๊ฒฝ๋์์ ์๋ฆฌ๋ ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ฉด ๋์ํ๋ ์บ์ ํญ๋ชฉ์ ๋ฌดํจํํ๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ดํ์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ ์ค์์น ์๋ค. ๋ฐ๋ผ์ ๋ฌด์ ๋ง์คํฌ์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ๋ซํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ฉด ๋ฌด์ ๋ง์คํฌ์์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํ๊ณ ์ ํ์ผ ์บ์ ํญ๋ชฉ์ ๊ฐฑ์ ํ ์ ์๋ค.
fanotify ์๋ฆผ ๊ทธ๋ฃน ์์ ํญ๋ชฉ๋ค์ ์์ด๋ ธ๋๋ฅผ ํตํด ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ง์ดํธ ID๋ฅผ ํตํด ๋ง์ดํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ๋์ผ ๋ง์ดํธ ๋ด์์ ์ด๋ฆ์ด ๋ฐ๋๊ฑฐ๋ ์ด๋ํ๋ ๊ฒฝ์ฐ์๋ ๋์ ํญ๋ชฉ์ด ์ ์ง๋๋ค. ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ญ์ ๋๊ฑฐ๋ ๋ค๋ฅธ ๋ง์ดํธ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ, ๋๋ ํ์ผ ์์คํ ์ด๋ ๋ง์ดํธ๊ฐ ์ธ๋ง์ดํธ ๋๋ ๊ฒฝ์ฐ์๋ ๋์ ํญ๋ชฉ์ด ์ญ์ ๋๋ค.
์๋ฆผ ๊ทธ๋ฃน์ผ๋ก ๊ฐ์ํ๋ ํ์ผ ์์คํ
๊ฐ์ฒด๋ค์์ ์ด๋ฒคํธ๊ฐ ์๊ธฐ๋ฉด fanotify ์์คํ
์์ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค์ด์ ํ์ ๋ชจ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด fanotify_init(2)์ด ๋ฐํํ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ (read(2)
๋ฑ์ผ๋ก) ๊ทธ ์ด๋ฒคํธ๋ค์ ์ฝ์ ์ ์๋ค.
์์ฑ๋๋ ์ด๋ฒคํธ์๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋๋ฐ ์๋ฆผ ์ด๋ฒคํธ์ ํ๊ฐ ์ด๋ฒคํธ์ด๋ค. ์๋ฆผ ์ด๋ฒคํธ๋ ์ ๋ณด๋ฅผ ์ค ๋ฟ์ด๋ฏ๋ก ๋ฒ์ฉ ์ด๋ฒคํธ๋ก ์ ๋ฌ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ์ ์ค์ผ ํ๋ค๋ ๊ฒ ์ธ์๋ ์์ ์ธก ์์ฉ์์ ์ด๋ค ํ๋๋ ์ทจํ ํ์๊ฐ ์๋ค. ์ด๋ฒคํธ๋ง๋ค ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๋ ๊ฑด FAN_REPORT_FID
(์๋ ์ฐธ๊ณ )๋ฅผ ์ฐ์ง ์๊ณ fanotify๋ฅผ ์ด๊ธฐํ ํ ์์ฉ์๋ง ํด๋น๋๋ค. ํ๊ฐ ์ด๋ฒคํธ๋ ์ด๋ค ํ์ผ ์ ๊ทผ์ ์น์ธํ ์ง ์ฌ๋ถ๋ฅผ ์์ ์ธก ์์ฉ์์ ํ๋จํด ๋ฌ๋ผ๋ ์์ฒญ์ด๋ค. ์ด ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ชฝ์์ ์ ๊ทผ์ ์น์ธํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์๋ต์ ์ค์ผ ํ๋ค.
์ด๋ฒคํธ๋ฅผ ์ฝ์ด ๋ค์ด๋ฉด fanotify ๊ทธ๋ฃน์ ์ด๋ฒคํธ ํ์์ ๊ทธ ์ด๋ฒคํธ๊ฐ ์ ๊ฑฐ๋๋ค. ์ฝ๊ธฐ๊ฐ ์ด๋ค์ง ํ๊ฐ ์ด๋ฒคํธ๋ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ฐ๊ธฐ๋ฅผ ํด์ ํ๊ฐ ํ๋จ์ ๋ด๋ฆฌ๊ฑฐ๋ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ ๋๊น์ง fanotify ๊ทธ๋ฃน์ ๋ด๋ถ ๋ชฉ๋ก์ ์ ์ง๋๋ค.
fanotify_init(2)์ด ๋ฐํํ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ read(2)
๋ฅผ ํธ์ถํ๋ฉด (fanotify_init(2) ํธ์ถ์์ FAN_NONBLOCK
ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์์๋ค๋ฉด) ํ์ผ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๊ฑฐ๋ ์๊ทธ๋์ ์ํด ํธ์ถ์ด ์ค๋จ(signal(7) ์ฐธ๊ณ )๋ ๋๊น์ง ๋ธ๋ก ํ๋ค.
fanotify_init(2)์ FAN_REPORT_FID
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ๊ฐ ์ด๋ฒคํธ๋ง๋ค ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ๋ฐํ๋๋ ์๋ฃ ๊ตฌ์กฐ์ ์ํฅ์ ์ค๋ค. read(2)
์ฑ๊ณต ํ์ ์ฝ๊ธฐ ๋ฒํผ์๋ ๋ค์ ๊ตฌ์กฐ์ฒด๊ฐ ํ ๊ฐ ์ด์ ๋ด๊ธด๋ค.
struct fanotify_event_metadata {
__u32 event_len;
__u8 vers;
__u8 reserved;
__u16 metadata_len;
__aligned_u64 mask;
__s32 fd;
__s32 pid;
};
fanotify_init(2)์ ํ๋๊ทธ ์ค ํ๋๋ก FAN_REPORT_FID
๋ฅผ ์ค ๊ฒฝ์ฐ์๋ ์ฝ๊ธฐ ๋ฒํผ์์ ๊ฐ ๋ฒ์ฉ fanotify_event_metadata
๊ตฌ์กฐ์ฒด ๋ค์์ ์๋ ์ค๋ช
ํ๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ฐ๋ผ์จ๋ค.
struct fanotify_event_info_fid {
struct fanotify_event_info_header hdr;
__kernel_fsid_t fsid;
unsigned char file_handle[0];
};
์ฑ๋ฅ์ ๊ณ ๋ คํ๋ฉด ํฐ ๋ฒํผ(๊ฐ๋ น 4096๋ฐ์ดํธ)๋ฅผ ์จ์ read(2)
ํ ๋ฒ์ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํ๋ ๊ฑธ ๊ถ์ฅํ๋ค.
read(2)
์ ๋ฐํ ๊ฐ์ ๋ฒํผ๋ก ๋ค์ด๊ฐ ๋ฐ์ดํธ ์์ด๋ฉฐ ์ค๋ฅ ์์๋ -1์ด๋ค. (ํ์ง๋ง BUGS ์ฐธ๊ณ .)
fanotify_event_metadata
๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
event_len
- ์ด ์ด๋ฒคํธ์ ๋ํ ๋ฐ์ดํฐ ๊ธธ์ด์ด์ ๋ฒํผ ๋ด ๋ค์ ์ด๋ฒคํธ๋ก์ ์คํ์
์ด๋ค.
FAN_REPORT_FID
๋ฅผ ์ ์ฐ๋ฉดevent_len
์ ๊ฐ์ ํญ์FAN_EVENT_METADATA_LEN
์ด๋ค.FAN_REPORT_FID
๋ฅผ ์ฐ๋ฉดevent_len
์ ๊ฐ๋ณ ๊ธธ์ด ํ์ผ ์๋ณ์ ํฌ๊ธฐ๊น์ง ๋ํด์ง๋ค. vers
- ์ด ํ๋๋ ๊ตฌ์กฐ์ฒด์ ๋ฒ์ ๋ฒํธ๋ฅผ ๋ด๋๋ค. ๊ทธ ๋ฒํธ๋ฅผ
FANOTIFY_METADATA_VERSION
๊ณผ ๋น๊ตํด์ ๋ฐํ์์ ๋ฐํ๋ ๊ตฌ์กฐ์ฒด๊ฐ ์ปดํ์ผ ํ์์ ์ ์๋ผ ์๋ ๊ตฌ์กฐ์ฒด์ ์ผ์นํ๋์ง ๊ฒ์ฆํด์ผ ํ๋ค. ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์์ฉ์์ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ฌ์ฉ ์๋๋ฅผ ํฌ๊ธฐํ๋ ๊ฒ ์ข๋ค. reserved
- ์ด ํ๋๋ ์ฌ์ฉํ์ง ์๋๋ค.
metadata_len
- ๊ตฌ์กฐ์ฒด์ ๊ธธ์ด์ด๋ค. ์ด ํ๋๋ ์ด๋ฒคํธ ์ ํ์ ๋ฐ๋ฅธ ์ ํ์ ํค๋๋ฅผ ๊ตฌํํ ์ ์๋๋ก ๋์ ๋ ๊ฒ์ด๋ค. ํ์ฌ ๊ตฌํ์์๋ ๊ทธ๋ฐ ์ ํ์ ํค๋๊ฐ ์๋ค.
mask
- ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ ํ๋ ๋นํธ ๋ง์คํฌ์ด๋ค. (์๋ ์ฐธ๊ณ .)
fd
-
์ ๊ทผ์ด ์ด๋ค์ง๊ณ ์๋ ๊ฐ์ฒด์ ๋ํ ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค. ํ ๋์นจ์ด ์ผ์ด๋ ๊ฒฝ์ฐ์๋
FAN_NOFD
์ด๋ค. ์์ฉ์์FAN_REPORT_FID
๋ฅผ ์จ์ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ด๊ธฐํ ํ๋ค๋ฉด ์์ ํ๋ ์ด๋ฒคํธ๋ง๋ค ์ด ๊ฐ์ดFAN_NOFD
๋ก ์ค์ ๋ผ ์๊ฒ ๋๋ค. ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฉํด ๊ฐ์ํ๋ ํ์ผ ๋ด์ง ๋๋ ํฐ๋ฆฌ์ ๋ด์ฉ์ ์ ๊ทผํ ์ ์๋ค. ์ฝ๋ ์ชฝ ์์ฉ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ์ ์ฑ ์์ด ์๋ค.fanotify_init(2) ํธ์ถ ์์ (
event_f_flags
์ธ์๋ฅผ ํตํด) ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋์ํ๋ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ์ค์ ํ ๋ค์ํ ํ์ผ ์ํ ํ๋๊ทธ๋ค์ ์ง์ ํ ์ ์๋ค. ๋๋ถ์ด ๊ทธ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์๋ (์ปค๋ ๋ด๋ถ์ฉ์ธ)FMODE_NONOTIFY
ํ์ผ ์ํ ํ๋๊ทธ๊ฐ ์ค์ ๋๋ค. ์ด ํ๋๊ทธ๋ fanotify ์ด๋ฒคํธ ์์ฑ์ ๋ง๋๋ค. ๊ทธ๋์ fanotify ์ด๋ฒคํธ ์์ ์๊ฐ ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ด์ฉํด ์๋ฆผ ๋์ ํ์ผ ๋ด์ง ๋๋ ํฐ๋ฆฌ์ ์ ๊ทผํ ๋ ์ด๋ฒคํธ๊ฐ ์ถ๊ฐ๋ก ์๊ธฐ์ง ์๊ฒ ๋๋ค. pid
-
fanotify_init(2)์์
FAN_REPORT_FID
ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ค๋ฉด ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ ์ค๋ ๋์ TID๋ค. ์๋๋ผ๋ฉด ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ ํ๋ก์ธ์ค์ PID๋ค.fanotify ์ด๋ฒคํธ ์ฒญ์ทจ ํ๋ก๊ทธ๋จ์์ ์ด PID๋ฅผ getpid(2)๊ฐ ๋ฐํํ๋ PID์ ๋น๊ตํด์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ ๊ฒ์ด ์๊ธฐ ์์ ์ธ์ง ์๋๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ํ์ผ ์ ๊ทผ ๋๋ฌธ์ธ์ง ํ๋จํ ์ ์๋ค.
mask
์ ๋นํธ ๋ง์คํฌ๋ ํ ํ์ผ ์์คํ
๊ฐ์ฒด์ ์ด๋ค ์ด๋ฒคํธ๋ค์ด ์ผ์ด๋ฌ๋์ง๋ฅผ ๋ํ๋ธ๋ค. ๊ฐ์ ์ค์ธ ํ์ผ ์์คํ
๊ฐ์ฒด์ ์ฌ๋ฌ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ฉด ์ด ๋ง์คํฌ์ ์ฌ๋ฌ ๋นํธ๊ฐ ์ค์ ๋ ์ ์๋ค. ํนํ ๊ฐ์ ํ์ผ ์์คํ
๊ฐ์ฒด์ ๋ํ ๋์ผ ํ๋ก์ธ์ค์์ ์ ๋ํ ์ฐ์๋ ์ด๋ฒคํธ๋ค์ด ํ ์ด๋ฒคํธ๋ก ํฉ์ณ์ง ์๋ ์๋ค. ๋จ, ์ ๋๋ก ํ๊ฐ ์ด๋ฒคํธ ๋ ๊ฐ๊ฐ ์ง์ ํญ๋ชฉ ํ๋๋ก ํฉ์ณ์ง์ง๋ ์๋๋ค.
mask
์ ๋ฑ์ฅํ ์ ์๋ ๋นํธ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
FAN_ACCESS
- ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ์ (BUGS ์ฐธ๊ณ ) ์ ๊ทผ(์ฝ๊ธฐ)์ด ์ด๋ค์ก๋ค.
FAN_OPEN
- ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋ ธ๋ค.
FAN_OPEN_EXEC
- ํ์ผ์ด ์คํํ๋ ค๋ ์๋๋ก ์ด๋ ธ๋ค. ์์ธํ ๋ด์ฉ์ fanotify_mark(2)์ NOTES ์ฐธ๊ณ .
FAN_ATTRIB
- ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ค.
FAN_CREATE
- ๊ฐ์ํ๋ ๋ถ๋ชจ ๋ด์์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ฑ๋๋ค.
FAN_DELETE
- ๊ฐ์ํ๋ ๋ถ๋ชจ ๋ด์์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ญ์ ๋๋ค.
FAN_DELETE_SELF
- ๊ฐ์ํ๋ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ ์์ฒด๊ฐ ์ญ์ ๋๋ค.
FAN_MOVED_FROM
- ๊ฐ์ํ๋ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ์๋ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋๋๋ค.
FAN_MOVED_TO
- ๊ฐ์ํ๋ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ๋ก ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋๋๋ค.
FAN_MOVE_SELF
- ๊ฐ์ํ๋ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋๋๋ค.
FAN_MODIFY
- ํ์ผ์ด ๋ณ๊ฒฝ๋๋ค.
FAN_CLOSE_WRITE
- ์ฐ๊ธฐ์ฉ(
O_WRONLY
๋O_RDWR
)์ผ๋ก ์ด๋ฆฐ ํ์ผ์ด ๋ซํ๋ค. FAN_CLOSE_NOWRITE
- ์ฝ๊ธฐ ์ ์ฉ(
O_RDONLY
)์ผ๋ก ์ด๋ฆฐ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ๋ซํ๋ค. FAN_Q_OVERFLOW
- ์ด๋ฒคํธ ํ๊ฐ ์ ํ์น์ธ 16384๊ฐ ํญ๋ชฉ์ ์ด๊ณผํ๋ค. fanotify_init(2)์ ํธ์ถํ ๋
FAN_UNLIMITED_QUEUE
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๊ทธ ์ ํ์ ๋ฌด์ํ ์ ์๋ค. FAN_ACCESS_PERM
- ์ด๋ ์์ฉ์์ ๊ฐ๋ น
read(2)
๋ readdir(2)์ ์ด์ฉํด ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฝ๊ณ ์ถ์ด ํ๋ค. ๊ทธ ํ์ผ ์์คํ ๊ฐ์ฒด ์ ๊ทผ์ ์ธ๊ฐํด์ผ ํ ์ง ๊ฒฐ์ ํ๋ ์๋ต์ (์๋ ์ค๋ช ํ๋ ๋๋ก) ์ค์ผ ํ๋ค. FAN_OPEN_PERM
- ์ด๋ ์์ฉ์์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ด๊ณ ์ถ์ด ํ๋ค. ๊ทธ ํ์ผ ์์คํ ๊ฐ์ฒด ์ด๊ธฐ๋ฅผ ์ธ๊ฐํด์ผ ํ ์ง ๊ฒฐ์ ํ๋ ์๋ต์ ์ค์ผ ํ๋ค.
FAN_OPEN_EXEC_PERM
- ์ด๋ ์์ฉ์์ ์คํ์ ์ํด ํ์ผ์ ์ด๊ณ ์ถ์ด ํ๋ค. ๊ทธ ํ์ผ ์์คํ ๊ฐ์ฒด์ ์คํ ๋ชฉ์ ์ด๊ธฐ๋ฅผ ์ธ๊ฐํด์ผ ํ ์ง ๊ฒฐ์ ํ๋ ์๋ต์ ์ค์ผ ํ๋ค. ์์ธํ ๋ด์ฉ์ fanotify_mark(2)์ NOTES ์ฐธ๊ณ .
๋ซ๊ธฐ ์ด๋ฒคํธ ํ์ธ์ ๋ค์ ๋นํธ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
FAN_CLOSE
-
ํ์ผ์ด ๋ซํ๋ค. ๋ค์๊ณผ ๊ฐ๋ค.
FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE
์ด๋ ์ด๋ฒคํธ ํ์ธ์ ๋ค์ ๋นํธ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
FAN_MOVE
-
ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ด๋๋๋ค. ๋ค์๊ณผ ๊ฐ๋ค.
FAN_MOVED_FROM | FAN_MOVED_TO
fanotify_event_info_fid
๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
hdr
-
fanotify_event_info_header
ํ์ ๊ตฌ์กฐ์ฒด๋ค. ์ด๋ฒคํธ์ ๋ง๋ถ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ๋ ์ ๋ณด๋ฅผ ๋ด์ ๋ฒ์ฉ ํค๋๋ค. ์๋ฅผ ๋ค์ดFAN_REPORT_FID
๋ฅผ ์จ์ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์์ฑํ์ ๋ ์ด ํค๋์info_type
ํ๋๊ฐFAN_EVENT_INFO_TYPE_FID
๋ก ์ค์ ๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋์์๋ ์ด ํ๋๋ฅผ ์ด์ฉํด ์ด๋ฒคํธ์ ๋ํด ์์ ํ ์ถ๊ฐ ์ ๋ณด๊ฐ ์ฌ๋ฐ๋ฅธ ์ข ๋ฅ์ธ์ง ํ์ธํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณfanotify_event_info_header
์๋len
ํ๋๊ฐ ์๋ค. ํ์ฌ ๊ตฌํ์์len
์ ๊ฐ์ ํญ์(event_len - FAN_EVENT_METADATA_LEN)
์ด๋ค. fsid
- ์ด๋ฒคํธ ์ฐ๊ด ๊ฐ์ฒด๋ฅผ ๋ด์ ํ์ผ ์์คํ
์ ๊ณ ์ ์๋ณ์๋ค.
__kernel_fsid_t
ํ์ ์ ๊ตฌ์กฐ์ฒด์ด๊ณ statfs(2) ํธ์ถ ์์f_fsid
์ ๊ฐ์ ๊ฐ์ ๋ด๊ณ ์๋ค. file_handle
-
file_handle
ํ์ ์ ๊ฐ๋ณ ๊ธธ์ด ๊ตฌ์กฐ์ฒด๋ค. ํ์ผ ์์คํ ์์ ํน์ ๊ฐ์ฒด์ ๋์ํ๋ ๋ถํฌ๋ช ํ ํธ๋ค์ด๋ฉฐ name_to_handle_at(2)์ด ๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ด์ฉํด ํ์ผ ์์คํ ์์ ํ์ผ์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์์ผ๋ฉฐ open_by_handle_at(2)์ ์ธ์๋ก ์ค ์ ์๋ค. ์ฐธ๊ณ ๋กFAN_CREATE
,FAN_DELETE
,FAN_MOVE
๊ฐ์ ๋๋ ํฐ๋ฆฌ ํญ๋ชฉ ์ด๋ฒคํธ์์file_handle
์ ์์ฑ/์ญ์ /์ด๋๋ ์์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๋ณ๊ฒฝ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ํ๋ธ๋ค. ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์ค์ด๋ผ๋ฉดFAN_ATTRIB
,FAN_DELETE_SELF
,FAN_MOVE_SELF
์ด๋ฒคํธ๊ฐ ์์ ๊ฐ์ฒด์ ๋ํfile_handle
์ ๋ณด๋ฅผ ์ ๋ฌํด ์ค๋ค.
fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํด read(2)
๊ฐ ๋ฐํํ fanotify ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ๋ค์ด ๋ด๊ธด ๋ฒํผ๋ฅผ ์ํํ๊ธฐ ์ํ ๋ค์ ๋งคํฌ๋ก๋ค์ด ์๋ค.
FAN_EVENT_OK(meta, len)
- ์ด ๋งคํฌ๋ก๋ ๋ฒํผ์ ๋จ์ ๊ธธ์ด
len
์ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์ ๊ธธ์ด ๋ฐmeta
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์event_len
ํ๋์ ๋น๊ตํด ๋ณธ๋ค. FAN_EVENT_NEXT(meta, len)
- ์ด ๋งคํฌ๋ก๋
meta
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์event_len
ํ๋์ ์๋ ๊ธธ์ด ๊ฐ์ ์ด์ฉํดmeta
๋ค์์ ์ค๋ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์ ์ฃผ์๋ฅผ ๊ณ์ฐํ๋ค.len
์ ํ์ฌ ๋ฒํผ์ ๋จ์ ์๋ ๋ฉํ๋ฐ์ดํฐ ๋ฐ์ดํธ ์์ด๋ค.meta
๋ค์์ ์๋ ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ฉฐ ๊ฑด๋๋ด ๋ฉํ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด์ ๋ฐ์ดํธ ์๋งํผlen
์ ์ค์ธ๋ค. (์ฆlen
์์meta->event_len
์ ๋บ๋ค.)
๋ํ ๋ค์ ๋งคํฌ๋ก๊ฐ ์๋ค.
FAN_EVENT_METADATA_LEN
- ์ด ๋งคํฌ๋ก๋
fanotify_event_metadata
๊ตฌ์กฐ์ฒด์ (๋ฐ์ดํธ ๋จ์) ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ค. ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ์ ์ต์ ํฌ๊ธฐ(๊ทธ๋ฆฌ๊ณ ํ์ฌ๋ ์ ์ผํ ํฌ๊ธฐ)์ด๋ค.
fanotify ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ๋ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ epoll(7), poll(2), select(2)์ ์ฃผ๋ฉด ์ฝ๊ธฐ ๊ฐ๋ฅ์ผ๋ก ํ์๋๋ค.
ํ๊ฐ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ ์์ฉ์์ fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ๋ค์ ํํ์ ๊ตฌ์กฐ์ฒด๋ฅผ write(2)
ํด ์ฃผ์ด์ผ ํ๋ค.
struct fanotify_response {
__s32 fd;
__u32 response;
};
์ด ๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
fd
-
fanotify_event_metadata
๊ตฌ์กฐ์ฒด์์ ์จ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค. response
- ์ด ํ๋๋ ๋์์ ์ธ๊ฐํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ธ๋ค. ํ์ผ ๋์์ ํ์ฉํ๋
FAN_ALLOW
๊ฑฐ๋ ํ์ผ ๋์์ ๊ฑฐ๋ถํ๋FAN_DENY
์ฌ์ผ ํ๋ค.
์ ๊ทผ์ ๊ฑฐ๋ถํ๋ฉด ์์ฒญ ์ธก ์์ฉ ํธ์ถ์ด EPERM
์ค๋ฅ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
fanotify ์๋ฆผ ๊ทธ๋ฃน์ ๊ฐ๋ฆฌํค๋ ๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ ๋ fanotify ๊ทธ๋ฃน์ด ํด์ ๋๊ณ ๊ทธ ์์์ ์ปค๋์์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. close(2) ์์ ๋ฏธ์ฒ๋ฆฌ ํ๊ฐ ์ด๋ฒคํธ๋ ํ์ฉ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
/proc/[pid]/fdinfo/[fd]
ํ์ผ์ด ํ๋ก์ธ์ค pid
์ ํ์ผ ๋์คํฌ๋ฆฝํฐ fd
์ ๋ํ fanotify ํ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. ์์ธํ ๋ด์ฉ์ proc(5) ์ฐธ๊ณ .
fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ฝ๊ธฐ๋ฅผ ํ ๋ ์ผ๋ฐ์ ์ธ read(2)
์ค๋ฅ์ ๋ํด์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
EINVAL
- ๋ฒํผ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ด๊ธฐ์ ๋๋ฌด ์๋ค.
EMFILE
- ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ฐ์์ ๋ํ ํ๋ก์ธ์ค๋ณ ์ ํ์ ๋๋ฌํ๋ค. getrlimit(2)์
RLIMIT_NOFILE
์ค๋ช ์ฐธ๊ณ . ENFILE
- ์ด๋ฆฐ ํ์ผ ์ด๊ฐ์์ ๋ํ ์์คํ
์ ์ญ ์ ํ์ ๋๋ฌํ๋ค. proc(5)์
/proc/sys/fs/file-max
์ฐธ๊ณ . ETXTBSY
-
fanotify_init(2) ํธ์ถ ์
event_f_flags
์ธ์์O_RDWR
๋O_WRONLY
๋ฅผ ์ง์ ํ์ผ๋ฉฐ ํ์ฌ ์คํ ์ค์ธ ๊ฐ์ ๋์ ํ์ผ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐread(2)
๊ฐ ์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ฐ๊ธฐ๋ฅผ ํ ๋ ์ผ๋ฐ์ ์ธ write(2)
์ค๋ฅ์ ๋ํด์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
EINVAL
- ์ปค๋ ๊ตฌ์ฑ์์ fanotify ์ ๊ทผ ํ๊ฐ๊ฐ ์ผ์ ธ ์์ง ์๊ฑฐ๋ ์๋ต ๊ตฌ์กฐ์ฒด์
response
๊ฐ์ด ์ ํจํ์ง ์๋ค. ENOENT
- ์๋ต ๊ตฌ์กฐ์ฒด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ
fd
๊ฐ ์ ํจํ์ง ์๋ค. ํ๊ฐ ์ด๋ฒคํธ์ ๋ํ ์๋ต์ ์ด๋ฏธ ์จ ์ค ๊ฒฝ์ฐ์ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฆฌ๋ ์ค ์ปค๋ ๋ฒ์ 2.6.36์์ fanotify API๊ฐ ๋์ ๋์๊ณ ๋ฒ์ 2.6.37์์ ํ์ฑํ๋์๋ค. ๋ฒ์ 3.8์์ fdinfo ์ง์์ด ์ถ๊ฐ๋์๋ค.
fanotify API๋ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ค.
fanotify API๋ CONFIG_FANOTIFY
๊ตฌ์ฑ ์ต์
์ ์ผ์ ์ปค๋์ ๋น๋ ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋๋ถ์ด fanotify ๊ถํ ์ฒ๋ฆฌ๋ CONFIG_FANOTIFY_ACCESS_PERMISSIONS
๊ตฌ์ฑ ์ต์
์ด ์ผ์ง ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
fanotify๋ ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋ก๊ทธ๋จ์ด ํ์ผ ์์คํ API๋ฅผ ํตํด ์ ๋ฐํ ์ด๋ฒคํธ๋ง์ ๋ณด๊ณ ํ๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ ํ์ผ ์์คํ ์์์ ์ผ์ด๋๋ ์๊ฒฉ ์ด๋ฒคํธ๋ ์ก์ง ๋ชปํ๋ค.
fanotify API๋ mmap(2), msync(2), munmap(2) ๋๋ฌธ์ ์ผ์ด๋ ์ ์๋ ํ์ผ ์ ๊ทผ ๋ฐ ๋ณ๊ฒฝ์ ๋ํด ์๋ ค ์ฃผ์ง ์๋๋ค.
๋๋ ํฐ๋ฆฌ์ ๋ํ ์ด๋ฒคํธ๋ ๋๋ ํฐ๋ฆฌ ์์ฒด๋ฅผ ์ด๊ณ ์ฝ๊ณ ๋ซ๋ ๊ฒฝ์ฐ์๋ง ์๊ธด๋ค. ํ์ํ ๋๋ ํฐ๋ฆฌ์ ์์์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๊ฑฐ๋ ๋ณ๊ฒฝํด๋ ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ์์ฒด์ ๋ํ ์ด๋ฒคํธ๊ฐ ์๊ธฐ์ง ์๋๋ค.
fanotify์์์ ๋๋ ํฐ๋ฆฌ ๊ฐ์๋ ์ฌ๊ท์ ์ด์ง ์๋ค. ๋๋ ํฐ๋ฆฌ ์๋ ์๋ธ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ๋ ค๋ฉด ๊ฐ์ ํญ๋ชฉ์ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค. (ํ์ง๋ง fanotify API์์๋ ํ์ํ ๋๋ ํฐ๋ฆฌ ์๋์ ์๋ธ๋๋ ํฐ๋ฆฌ๊ฐ ์๊ธด ๊ฑธ ํ์งํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ฌ๊ท์ ์ธ ๊ฐ์๊ฐ ์ด๋ ต๋ค.) ๋ง์ดํธ๋ฅผ ๊ฐ์ํ๋ฉด ๋๋ ํฐ๋ฆฌ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ๊ฐ์ํ ์ ์๋ค. ํ์ผ ์์คํ ์ ๊ฐ์ํ๋ฉด ํ์ผ ์์คํ ์ ๋ชจ๋ ๋ง์ดํธ ์ธ์คํด์ค์์ ์ผ์ด๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ํ ์ ์๋ค.
์ด๋ฒคํธ ํ๊ฐ ๋์น ์ ์๋ค. ์ด ๊ฒฝ์ฐ ์ด๋ฒคํธ๊ฐ ์ ์ค๋๋ค.
๋ฆฌ๋
์ค 3.19 ์ ์์ fallocate(2)๊ฐ fanotify ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์์๋ค. ๋ฆฌ๋
์ค 3.19๋ถํฐ fallocate(2) ํธ์ถ์ด FAN_MODIFY
์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ค.
๋ฆฌ๋ ์ค 3.17 ํ์ฌ ๋ค์ ๋ฒ๊ทธ๋ค์ด ์กด์ฌํ๋ค.
-
๋ฆฌ๋ ์ค์์ ์ด๋ค ํ์ผ ์์คํ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฒฝ๋ก๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ํ์ผ ์์คํ ์ผ๋ถ๋ฅผ mount(8)์
--bind
์ต์ ์ผ๋ก ๋ค์ ๋ง์ดํธ ํ ์๋ ์๋ค. ๋ง์ดํธ์ ํ์๋ฅผ ํ ๋ฆฌ์ค๋๋ ํด๋น ๋ง์ดํธ๋ฅผ ์ฐ๋ ํ์ผ ์์คํ ๊ฐ์ฒด์ ์ ๋ฐ๋ ์ด๋ฒคํธ์ ๋ํด์๋ง ์๋ฆผ์ ๋ฐ๊ฒ ๋๋ค. ๋ค๋ฅธ ์ด๋ฒคํธ๋ ์๋ฆผ์ด ์ด๋ค์ง์ง ์๋๋ค. -
์ด๋ฒคํธ๊ฐ ์๊ธธ ๋ ํ์ผ์ ๋ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๋ฌํด ์ฃผ๊ธฐ ์ ์ ์์ ์ธก ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ID๊ฐ ํ์ผ์ ์ฝ๊ธฐ ๋ด์ง ์ฐ๊ธฐ ๊ถํ์ด ์๋์ง ํ์ธํ์ง ์๋๋ค. ๋นํน๊ถ ์ฌ์ฉ์๊ฐ ์คํํ ํ๋ก๊ทธ๋จ์
CAP_SYS_ADMIN
์ญ๋ฅ์ด ์ค์ ๋ผ ์๋ ๊ฒฝ์ฐ ๋ณด์ ์ํ์ด ๋๋ค. -
read(2)
ํธ์ถ ๋ด์์ fanotify ํ์ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ๊บผ๋ด ์ฒ๋ฆฌํ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ ๋ฐํ ๊ฐ์ ์ค๋ฅ ๋ฐ์ ์ ๊น์ง ์ฌ์ฉ์ ๊ณต๊ฐ ๋ฒํผ๋ก ์ฑ๊ณต์ ์ผ๋ก ๋ณต์ฌํ ์ด๋ฒคํธ๋ค์ ์ด ๊ธธ์ด๊ฐ ๋๋ค. ์ฆ ๋ฐํ ๊ฐ์ด -1์ด ์๋๊ณerrno
๊ฐ ์ค์ ๋์ง ์๋๋ค. ๊ทธ๋์ ์ฝ๋ ์ชฝ ์์ฉ์์ ์ค๋ฅ๋ฅผ ํ์งํ ๋ฐฉ๋ฒ์ด ์๋ค.
์๋์ ๋ ์์ ํ๋ก๊ทธ๋จ์ด fanotify API ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋ค.
์ฒซ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ ์ด๋ฒคํธ ๊ฐ์ฒด ์ ๋ณด๊ฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํํ๋ก ์ ๋ฌ๋๋๋ก ํด์ fanotify๋ฅผ ์ฐ๋ ์์์ด๋ค. ํ๋ก๊ทธ๋จ์์ ๋ช
๋ นํ ์ธ์๋ก ๋ฐ์ ๋ง์ดํธ ์ง์ ์ ํ์๋ฅผ ํ๊ณ ์ FAN_OPEN_PERM
๋ฐ FAN_CLOSE_WRITE
์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ๊ถํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด FAN_ALLOW
์๋ต์ ์ค๋ค.
๋ค์ ์
ธ ์ธ์
์ ํ๋ก๊ทธ๋จ ์คํ ์๋ฅผ ๋ณด์ฌ ์ค๋ค. ์ด ์ธ์
๊ณผ ๋๋ถ์ด ํ์ผ /home/user/temp/notes
ํธ์ง์ด ์ด๋ค์ก๋ค. ํ์ผ์ ์ด๊ธฐ ์ ์๋ FAN_OPEN_PERM
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. ํ์ผ์ ๋ซ์ ํ์๋ FAN_CLOSE_WRITE
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. ์ฌ์ฉ์๊ฐ ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ด ๋๋๋ค.
# ./fanotify_example /home
Press enter key to terminate.
Listening for events.
FAN_OPEN_PERM: File /home/user/temp/notes
FAN_CLOSE_WRITE: File /home/user/temp/notes
Listening for events stopped.
#define _GNU_SOURCE /* O_LARGEFILE ์ ์๋ฅผ ์ป๊ธฐ ์ํด */
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <poll.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/fanotify.h>
#include <unistd.h>
/* ํ์ผ ๋์คํฌ๋ฆฝํฐ 'fd'์์ ๊ฐ์ฉ fanotify ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ์ฝ์ด ๋ค์ด๊ธฐ */
static void
handle_events(int fd)
{
const struct fanotify_event_metadata *metadata;
struct fanotify_event_metadata buf[200];
ssize_t len;
char path[PATH_MAX];
ssize_t path_len;
char procfd_path[PATH_MAX];
struct fanotify_response response;
/* fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์ด๋ฒคํธ๋ฅผ ์ฝ์ ์ ์๋ ๋์ ๋ฐ๋ณต */
for (;;) {
/* ์ด๋ฒคํธ ์ฝ๊ธฐ */
len = read(fd, (void *) &buf, sizeof(buf));
if (len == -1 && errno != EAGAIN) {
perror("read");
exit(EXIT_FAILURE);
}
/* ๊ฐ์ฉ ๋ฐ์ดํฐ ๋์ ๋๋ฌํ๋์ง ํ์ธ */
if (len <= 0)
break;
/* ๋ฒํผ์ ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ ๊ฐ๋ฆฌํค๊ธฐ */
metadata = buf;
/* ๋ฒํผ ๋ด ๋ชจ๋ ์ด๋ฒคํธ ๋๊ธฐ */
while (FAN_EVENT_OK(metadata, len)) {
/* ๋ฐํ์ ๊ตฌ์กฐ์ฒด์ ์ปดํ์ผ ํ์ ๊ตฌ์กฐ์ฒด๊ฐ ์ผ์นํ๋์ง ํ์ธ */
if (metadata->vers != FANOTIFY_METADATA_VERSION) {
fprintf(stderr,
"Mismatch of fanotify metadata version.\n");
exit(EXIT_FAILURE);
}
/* metadata->fd๋ ํ ๋์นจ์ ๋ํ๋ด๋ FAN_NOFD๊ฑฐ๋
ํ์ผ ๋์คํฌ๋ฆฝํฐ(์์ ์๋ ์ ์)์. ์ฌ๊ธฐ์ ํ ๋์นจ์
๊ทธ๋ฅ ๋ฌด์ํจ. */
if (metadata->fd >= 0) {
/* ์ด๊ธฐ ๊ถํ ์ด๋ฒคํธ ์ฒ๋ฆฌ */
if (metadata->mask & FAN_OPEN_PERM) {
printf("FAN_OPEN_PERM: ");
/* ํ์ผ ์ด๊ธฐ ํ์ฉ */
response.fd = metadata->fd;
response.response = FAN_ALLOW;
write(fd, &response,
sizeof(struct fanotify_response));
}
/* ์ฐ๊ธฐ ๊ฐ๋ฅ ํ์ผ ๋ซ๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ */
if (metadata->mask & FAN_CLOSE_WRITE)
printf("FAN_CLOSE_WRITE: ");
/* ์ ๊ทผ ํ์ผ์ ๊ฒฝ๋ก๋ช
์ป์ด์ ์ฐ๊ธฐ */
snprintf(procfd_path, sizeof(procfd_path),
"/proc/self/fd/%d", metadata->fd);
path_len = readlink(procfd_path, path,
sizeof(path) - 1);
if (path_len == -1) {
perror("readlink");
exit(EXIT_FAILURE);
}
path[path_len] = '\0';
printf("File %s\n", path);
/* ์ด๋ฒคํธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ๊ธฐ */
close(metadata->fd);
}
/* ๋ค์ ์ด๋ฒคํธ๋ก */
metadata = FAN_EVENT_NEXT(metadata, len);
}
}
}
int main(int argc, char *argv[])
{
char buf;
int fd, poll_num;
nfds_t nfds;
struct pollfd fds[2];
/* ๋ง์ดํธ ์ง์ ์ฃผ์ด์ก๋์ง ํ์ธ */
if (argc != 2) {
fprintf(stderr, "Usage: %s MOUNT\n", argv[0]);
exit(EXIT_FAILURE);
}
printf("Press enter key to terminate.\n");
/* fanotify API ์ ๊ทผ์ ์ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ง๋ค๊ธฐ */
fd = fanotify_init(FAN_CLOEXEC | FAN_CLASS_CONTENT | FAN_NONBLOCK,
O_RDONLY | O_LARGEFILE);
if (fd == -1) {
perror("fanotify_init");
exit(EXIT_FAILURE);
}
/* ๋ง์ดํธ์ ๋ค์ ํ์:
- ํ์ผ ์ด๊ธฐ ์ ๊ถํ ์ด๋ฒคํธ
- ์ฐ๊ธฐ ๊ฐ๋ฅ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ์ ํ
์๋ฆผ ์ด๋ฒคํธ */
if (fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_OPEN_PERM | FAN_CLOSE_WRITE, AT_FDCWD,
argv[1]) == -1) {
perror("fanotify_mark");
exit(EXIT_FAILURE);
}
/* ํด๋ง ์ค๋น */
nfds = 2;
/* ์ฝ์ ์
๋ ฅ */
fds[0].fd = STDIN_FILENO;
fds[0].events = POLLIN;
/* fanotify ์
๋ ฅ */
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; /* poll() ์ฌ์์ */
perror("poll"); /* ์์ ๋ชปํ ์ค๋ฅ */
exit(EXIT_FAILURE);
}
if (poll_num > 0) {
if (fds[0].revents & POLLIN) {
/* ์ฝ์ ์
๋ ฅ ์์. stdin ๋น์ฐ๊ณ ๋๋ด๊ธฐ */
while (read(STDIN_FILENO, &buf, 1) > 0 && buf != '\0')
continue;
break;
}
if (fds[1].revents & POLLIN) {
/* inotify ์ด๋ฒคํธ ์์ */
handle_events(fd);
}
}
}
printf("Listening for events stopped.\n");
exit(EXIT_SUCCESS);
}
๋ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ FAN_REPORT_FID
๋ฅผ ์ผ์ fanotify๋ฅผ ์ฐ๋ ์์์ด๋ค. ํ๋ก๊ทธ๋จ์์ ๋ช
๋ นํ ์ธ์๋ก ๋ฐ์ ํ์ผ ์์คํ
๊ฐ์ฒด์ ํ์๋ฅผ ํ๊ณ ์ FAN_CREATE
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ์ด๋ฒคํธ ๋ง์คํฌ๋ฅผ ๋ณด๋ฉด ์ด๋ค ์ข
๋ฅ์ (ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ) ํ์ผ ์์คํ
๊ฐ์ฒด๊ฐ ์์ฑ๋๋์ง ์ ์ ์๋ค. ๋ฒํผ์์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ฝ์ด์ ์ฐจ๋ก๋ก ์ฒ๋ฆฌํ ๋ค์ ํ๋ก๊ทธ๋จ์ ๊ทธ๋๋ก ์ข
๋ฃํ๋ค.
๋ค์ ๋ ๋ฒ์ ์ ธ ์ธ์ ์ ๊ฐ์ ๋์ ๊ฐ์ฒด์ ๋ค๋ฅธ ๋์์ ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ ํธ์ถํ ๊ฒ์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์
์์ /home/user
์ ํ์๊ฐ ์ด๋ค์ง๋ ๊ฑธ ๋ณผ ์ ์๋ค. ๊ทธ ๋ค์์ ์ ๊ท ํ์ผ /home/user/testfile.txt
์์ฑ์ด ์ด๋ค์ง๋ค. ๊ทธ๋ฌ๋ฉด ํ์ผ์ ๋ถ๋ชจ์ธ ๊ฐ์ ๋์ ๋๋ ํฐ๋ฆฌ ๊ฐ์ฒด์ ๋ํด FAN_CREATE
์ด๋ฒคํธ๊ฐ ์๊ฒจ์ ๋ณด๊ณ ๋๋ค. ๊ทธ๋ฌ๊ณ ์ ๋ฒํผ์ ์กํ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๊ณ ๋๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ด ๋๋๋ค.
# ./fanotify_fid /home/user
Listening for events.
FAN_CREATE (file created): Directory /home/user has been modified.
All events processed successfully. Program exiting.
$ touch /home/user/testing # ๋ค๋ฅธ ํฐ๋ฏธ๋์์
๋ ๋ฒ์งธ ์ธ์
์์ /home/user
์ ํ์๊ฐ ์ด๋ค์ง๋ ๊ฑธ ๋ณผ ์ ์๋ค. ๊ทธ ๋ค์์ ๋๋ ํฐ๋ฆฌ /home/user/testdir
์์ฑ์ด ์ด๋ค์ง๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋จ์์ FAN_CREATE
๋ฐ FAN_ONDIR
์ด๋ฒคํธ๊ฐ ๋ง๋ค์ด์ง๋ค.
# ./fanotify_fid /home/user
Listening for events.
FAN_CREATE | FAN_ONDIR (subdirectory created):
Directory /home/user has been modified.
All events processed successfully. Program exiting.
$ mkdir -p /home/user/testing # ๋ค๋ฅธ ํฐ๋ฏธ๋์์
#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fanotify.h>
#include <unistd.h>
#define BUF_SIZE 256
int
main(int argc, char **argv)
{
int fd, ret, event_fd;
ssize_t len, path_len;
char path[PATH_MAX];
char procfd_path[PATH_MAX];
char events_buf[BUF_SIZE];
struct file_handle *file_handle;
struct fanotify_event_metadata *metadata;
struct fanotify_event_info_fid *fid;
if (argc != 2) {
fprintf(stderr, "Invalid number of command line arguments.\0);
exit(EXIT_FAILURE);
}
/* FAN_REPORT_FID ํ๋๊ทธ๋ก fanotify ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ง๋ค์ด์
ํ๋ก๊ทธ๋จ์ด fid ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ฒ ํ๋ค. */
fd = fanotify_init(FAN_CLASS_NOTIF | FAN_REPORT_FID, 0);
if (fd == -1) {
perror("fanotify_init");
exit(EXIT_FAILURE);
}
/* argv[1]๋ก ๋ฐ์ ํ์ผ ์์คํ
๊ฐ์ฒด์ ํ์๋ฅผ ํ๋ค. */
ret = fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_ONLYDIR,
FAN_CREATE | FAN_ONDIR,
AT_FDCWD, argv[1]);
if (ret == -1) {
perror("fanotify_mark");
exit(EXIT_FAILURE);
}
printf("Listening for events.\0);
/* ์ด๋ฒคํธ ํ์์ ์ด๋ฒคํธ๋ฅผ ์ฝ์ด์ ๋ฒํผ๋ก */
len = read(fd, (void *) &events_buf, sizeof(events_buf));
if (len == -1 && errno != EAGAIN) {
perror("read");
exit(EXIT_FAILURE);
}
/* ๋ฒํผ์ ๋ชจ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ */
for (metadata = (struct fanotify_event_metadata *) events_buf;
FAN_EVENT_OK(metadata, len);
metadata = FAN_EVENT_NEXT(metadata, len)) {
fid = (struct fanotify_event_info_fid *) (metadata + 1);
file_handle = (struct file_handle *) fid->handle;
/* ์ด๋ฒคํธ ์ ๋ณด์ ํ์
์ด ๋ง๋์ง ํ์ธ */
if (fid->hdr.info_type != FAN_EVENT_INFO_TYPE_FID) {
fprintf(stderr, "Received unexpected event info type.\0);
exit(EXIT_FAILURE);
}
if (metadata->mask == FAN_CREATE)
printf("FAN_CREATE (file created):");
if (metadata->mask == FAN_CREATE | FAN_ONDIR)
printf("FAN_CREATE | FAN_ONDIR (subdirectory created):");
/* FAN_REPORT_FID๊ฐ ์ผ์ ธ ์์ผ๋ฉด metadata->fd๊ฐ FAN_NOFD๋ก
์ค์ ๋ผ ์๋ค. ์ด๋ฒคํธ ๊ด๋ จ ํ์ผ ๊ฐ์ฒด์ ๋ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ
์ป์ผ๋ ค๋ฉด fanotify_event_info_fid ์์ ์๋ struct
file_handle์ open_by_handle_at(2) ์์คํ
ํธ์ถ๊ณผ ํจ๊ป
์ด์ฉํ ์ ์๋ค. ์์คํ
ํธ์ถ ์ ์ ๊ทธ ๊ฐ์ฒด๊ฐ ์ญ์ ๋๋ ๊ฒฝ์ฐ๋ฅผ
๋๋นํด์ ESTALE ๊ฒ์ฌ๋ฅผ ํ๋ค. */
event_fd = open_by_handle_at(AT_FDCWD, file_handle, O_RDONLY);
if (ret == -1) {
if (errno == ESTALE) {
printf("File handle is no longer valid. "
"File has been deleted\0);
continue;
} else {
perror("open_by_handle_at");
exit(EXIT_FAILURE);
}
}
snprintf(procfd_path, sizeof(procfd_path), "/proc/self/fd/%d",
event_fd);
/* ๋ณ๊ฒฝ๋ dentry์ ๊ฒฝ๋ก ๊ฐ์ ธ์์ ์ฐ๊ธฐ */
path_len = readlink(procfd_path, path, sizeof(path) - 1);
if (path_len == -1) {
perror("readlink");
exit(EXIT_FAILURE);
}
path[path_len] = '\ ';
printf("\tDirectory '%s' has been modified.\0, path);
/* ์ด ์ด๋ฒคํธ์ ์ฐ๊ด ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ๊ธฐ */
close(event_fd);
}
printf("All events processed successfully. Program exiting.\0);
exit(EXIT_SUCCESS);
}
fanotify_init(2), fanotify_mark(2), inotify(7)
2019-08-02