文件和文件夾管理 - 監(jiān)視文件事件

Linux提供了一個接口inotify來監(jiān)視文件溶浴,比如說監(jiān)視他們什么時候移動案铺,從哪里被讀,寫鹦蠕,或刪除冒签。

初始化 inotify

#include <sys/inotify.h>
int inotify_init1(int flags);

flag通常為0。
成功返回一個代表初始化實例的fd, 失敗返回-1并設(shè)置errno钟病。

int  fd;
fd = inotify_init1(0);
if(fd == -1){
      perror("inotity_init1")萧恕;
      exit(EXIT_FAILURE);
}

監(jiān)視watch

添加一個新的watch

#include <sys/inotify.h>
int inotify_add_watch(int fd, const char *path, uint32_t mask);

成功返回一個新的watch描述符,失敗返回-1并且設(shè)置errno档悠。

watch masks

多個inotify event之間是或的關(guān)系廊鸥。

  • IN_ACCESS 文件被讀取望浩。
  • IN_MODIFY 文件被寫入辖所。
  • IN_ATTRIB
    The file’s metadata (for example, the owner, permissions, or extended attributes)
    was changed.
  • IN_CLOSE_WRITE 文件被寫過后關(guān)閉。
  • IN_CLOSE_NOWRITE 文件沒被寫過就關(guān)閉了磨德。
  • IN_OPEN 文件被打開了
  • IN_MOVED_FROM 一個文件從監(jiān)視的文件夾中被移走了缘回。
  • IN_MOVED_TO 一個文件被移入了監(jiān)視的文件夾中。
  • IN_CREATE 一個文件被創(chuàng)建在監(jiān)視的文件夾中
  • IN_DELETE 一個文件被刪除在監(jiān)視的文件夾中
  • IN_DELETE_SELF 監(jiān)視的目標(biāo)自己刪除了典挑。
    IN_MOVE_SELF 監(jiān)視的目標(biāo)自身被移走了酥宴。
  • IN_ALL_EVENTS All legal events.
  • IN_CLOSE All events related to closing (currently, both IN_CLOSE_WRITE and IN_CLOSE_NOW
    RITE).
  • IN_MOVE All move-related events (currently, both IN_MOVED_FROM and IN_MOVED_TO).
int wd;
wd = inotify_add_watch (fd, "/etc", IN_ACCESS | IN_MODIFY);
if (wd == ?1) {
      perror ("inotify_add_watch");
      exit (EXIT_FAILURE);
}

示例為/etc的所有讀或?qū)懱砑右粋€watch。 如果/etc 中的任何文件被寫入或讀取您觉,inotify 將事件發(fā)送給文件描述符fd拙寡。

inotify Events

#include <sys/inotify.h>
struct inotify_event {
        int wd; /* watch descriptor */
        uint32_t mask; /* mask of events */
        uint32_t cookie; /* unique cookie */
        uint32_t len; /* size of 'name' field */
        char name[]; /* nul-terminated name */
};

Reading inotify events

char buf[BUF_LEN] __attribute__((aligned(4)));
ssize_t len, i = 0;
/* read BUF_LEN bytes' worth of events */
len = read (fd, buf, BUF_LEN);
/* loop over every read event until none remain */
while (i < len) {
          struct inotify_event *event = (struct inotify_event *) &buf[i];
          printf ("wd=%d mask=%d cookie=%d len=%d dir=%s\n",event->wd, event->mask,event->cookie, event->len, (event->mask & IN_ISDIR) ? "yes" : "no");
/* if there is a name, print it */
if (event->len)
           printf ("name=%s\n", event->name);

Advanced inotify events

In addition to the standard events, inotify can generate other events:

  • IN_IGNORED
    The watch represented by wd has been removed. This can occur because the user manually removed the watch or because the watched object no longer exists. We will discuss this event in a subsequent section.
  • IN_ISDIR
    The affected object is a directory. (If not set, the affected object is a file.)
  • IN_Q_OVERFLOW
    The inotify queue overflowed. The kernel limits the size of the event queue to prevent unbounded consumption of kernel memory. Once the number of pending events reaches one less than the maximum, the kernel generates this event and appends it to the tail of the queue. No further events are generated until the queue
    is read from, reducing its size below the limit.
  • IN_UNMOUNT
    The device backing the watched object was unmounted. Thus, the object is no longer available; the kernel will remove the watch and generate the IN_IGNORED
    event.

Any watch can generate these events; the user need not set them explicitly.

if (event->mask & IN_ACCESS)
        printf ("The file was read from!\n");
if (event->mask & IN_UNMOUNTED)
        printf ("The file's backing device was unmounted!\n);
if (event->mask & IN_ISDIR)
        printf ("The file is a directory!\n");

Advanced WatchOptions

  • IN_DONT_FOLLOW
    If this value is set, and if the target of path or any of its components is a symbolic link, the link is not followed and inotify_add_watch() fails.
  • IN_MASK_ADD
    Normally, if you call inotify_add_watch() on a file on which you have an existing watch, the watch mask is updated to reflect the newly provided mask. If this flag is
    set in mask, the provided events are added to the existing mask.
  • IN_ONESHOT
    If this value is set, the kernel automatically removes the watch after generating the first event against the given object. The watch is, in effect, “one shot.”
  • IN_ONLYDIR
    If this value is set, the watch is added only if the object provided is a directory. If path represents a file, not a directory, inotify_add_watch() fails.
int wd;
/*
 * Watch '/etc/init.d' to see if it moves, but only if it is a
 * directory and no part of its path is a symbolic link.
 */
wd = inotify_add_watch (fd,"/etc/init.d",
                                          IN_MOVE_SELF |
                                          IN_ONLYDIR |
                                          IN_DONT_FOLLOW);
if (wd == ?1)
        perror ("inotify_add_watch");

Removing an inotify Watch

#include <inotify.h>
int inotify_rm_watch (int fd, uint32_t wd);
int ret;
ret = inotify_rm_watch (fd, wd);
if (ret)
      perror ("inotify_rm_watch");

成功返回0,失敗返回-1琳水,并設(shè)置errno肆糕。

Obtaining the Size of the Event Queue

unsigned int queue_len;
int ret;
ret = ioctl (fd, FIONREAD, &queue_len);
if (ret < 0)
    perror ("ioctl");
else
    printf ("%u bytes pending in queue\n", queue_len);

Destroying an inotify Instance

int ret;
/* 'fd' was obtained via inotify_init() */
ret = close (fd);
if (fd == ?1)
    perror ("close");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市在孝,隨后出現(xiàn)的幾起案子诚啃,更是在濱河造成了極大的恐慌,老刑警劉巖私沮,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件始赎,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機造垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門魔招,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人五辽,你說我怎么就攤上這事仆百。” “怎么了奔脐?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵俄周,是天一觀的道長。 經(jīng)常有香客問我髓迎,道長峦朗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任排龄,我火速辦了婚禮波势,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橄维。我一直安慰自己尺铣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布争舞。 她就那樣靜靜地躺著凛忿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竞川。 梳的紋絲不亂的頭發(fā)上店溢,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音委乌,去河邊找鬼床牧。 笑死,一個胖子當(dāng)著我的面吹牛遭贸,可吹牛的內(nèi)容都是我干的戈咳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼壕吹,長吁一口氣:“原來是場噩夢啊……” “哼著蛙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算利,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤册踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后效拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暂吉,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胖秒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慕的。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肮街,死狀恐怖风题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫉父,我是刑警寧澤沛硅,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站绕辖,受9級特大地震影響摇肌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仪际,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一围小、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧树碱,春花似錦肯适、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泥技。三九已至混弥,卻和暖如春袭异,著一層夾襖步出監(jiān)牢的瞬間钳垮,已是汗流浹背惑淳。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饺窿,地道東北人歧焦。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像肚医,于是被迫代替她去往敵國和親绢馍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,308評論 0 10
  • The Inner Game of Tennis W Timothy Gallwey Jonathan Cape ...
    網(wǎng)事_79a3閱讀 11,924評論 3 20
  • 日常應(yīng)用中肠套,常常會遇到以下場景舰涌,監(jiān)控文件夾A,若文件夾中的B文件發(fā)生變化你稚,則執(zhí)行C命令瓷耙。Linux下可以通過ino...
    SkTj閱讀 2,052評論 0 0
  • 在我們?nèi)松穆猛旧现焯桑覀円恢泵媾R選擇。我們每一次選擇搁痛,都竭盡全力希望自己的選擇是正確的长搀。 事與愿違,我們面臨的選擇...
    心云書閱讀 344評論 0 3
  • 【大偉薦語】人必須爭氣和強大鸡典,才不會被欺負(fù)源请;也必須謙遜和慈悲,才不會欺負(fù)別人彻况。 ——張小嫻 ???? 遐思...
    求索大偉閱讀 77評論 0 0