Inotifyを使用して、あるフォルダの一挙手一投足を監視します.
参照先:
http://fred-zone.blogspot.com/2008/11/inotify.html
Linuxの下である材料クリップの変化を監視するには、土法製鋼のタイミングでスキャンしたり、修正時間をチェックしたり、ファイルを一つ一つ開いたりする方法がたくさんありますが、これらの過程には、大量で余分なIOアクセスが伴うことが多いです.これに対してinotifyを使用すると便利で効率的に見えます.halが現れてから、inotifyを使ってファイルや資料クリップの一挙手一投足のeventをブロックすることができ、GLibを統合すれば、わずか数行で実作することができます.
この例では、/usr/share/applicationsフォルダ内のファイル更新eventを傍受し、印刷します.このフォルダはFreeDesktop.org Specでデスクトップアプリケーションの情報を記録するために使用されるため、ソフトウェアをインストールまたは削除すると、ファイルの新規または削除されたeventが受信されます.
http://fred-zone.blogspot.com/2008/11/inotify.html
Linuxの下である材料クリップの変化を監視するには、土法製鋼のタイミングでスキャンしたり、修正時間をチェックしたり、ファイルを一つ一つ開いたりする方法がたくさんありますが、これらの過程には、大量で余分なIOアクセスが伴うことが多いです.これに対してinotifyを使用すると便利で効率的に見えます.halが現れてから、inotifyを使ってファイルや資料クリップの一挙手一投足のeventをブロックすることができ、GLibを統合すれば、わずか数行で実作することができます.
#include <glib.h>
#include <sys/inotify.h>
#include <sys/types.h>
#include <errno.h>
void inotify_events_io_func(GIOChannel *channel, GIOCondition condition, gpointer data)
{
char buf[1024];
struct inotify_event *event;
gint index = 0;
gint len = 0;
gint fd = g_io_channel_unix_get_fd(channel);
while(((len = read(fd, &buf, sizeof(buf))) < 0) && (errno == EINTR));
while(index<len) {
event = (struct inotify_event*)(buf+index);
/* read events */
switch(event->mask)
{
case IN_MODIFY:
printf("MODIFY
");
break;
case IN_CREATE
printf("CREATE
");
break;
case IN_DELETE:
printf("DELETE
");
break;
}
index += sizeof(struct inotify_event) + event->len;
}
}
int main(int argc, char* argv[]
)
{
GMainLoop *loop;
GIOChannel *channel;
gint ino_fd = 0;
gint ino_wd = 0;
/* inotify */
ino_fd = inotify_init();
ino_wd = inotify_add_watch(ino_fd, "/usr/share/applications", IN_MODIFY | IN_CREATE | IN_DELETE);
channel = g_io_channel_unix_new(ino_fd);
g_io_add_watch(channel, G_IO_IN, (GIOFunc)inotify_events_io_func, (gpointer)NULL);
loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
}
この例では、/usr/share/applicationsフォルダ内のファイル更新eventを傍受し、印刷します.このフォルダはFreeDesktop.org Specでデスクトップアプリケーションの情報を記録するために使用されるため、ソフトウェアをインストールまたは削除すると、ファイルの新規または削除されたeventが受信されます.