inotify-tools

inotifywaitコマンドを使ったshellスクリプトで「逐次」作成されるファイルの動的処理を行ったが、
どうも漏れがある。つまり処理されないファイルが発生した

これは困った事態なのでスクリプトではなく、inotifyをC言語に組み込ませてみた
http://www.nminoru.jp/~nminoru/programming/file_change_notification.htmlを参考にしました
カメラ制御マシンから送られてくるmrc,mrcsが保存し終えたら、「dorun.sh」というスクリプトが動く感じで。
mrc、mrcsよりtiffの方がいいのかもしれないが、一通りこれで行けそう

/*
 * 参照先:
 *  [http://www.nminoru.jp/~nminoru/programming/file_change_notification.html]
 *  gcc -Wall -o inotify inotify.c
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h> /* for offsetof */
#include <string.h> /* for memmove */
#include <errno.h>
#include <limits.h>
#include <sys/inotify.h>
 
int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("Usage: inotify dir\n");
        exit(EXIT_SUCCESS);
    }
    int fd  = inotify_init();
    if (fd == -1) {
        perror("inotify_init");
        exit(EXIT_FAILURE);
    }
    int wd = inotify_add_watch(fd, argv[1], IN_CLOSE_WRITE);
    if (wd < 0) {
            perror("inotify_add_watch");
            exit(EXIT_FAILURE);
    }
 
    for (;;) {
        int i, aux=0, ret;
        char buffer[65536];
    reread:
        ret = read(fd, buffer + aux, sizeof(buffer) - aux);
        if (ret == -1) {
            if (ret == -EINTR)
                goto reread;
            perror("read");
            exit(EXIT_FAILURE);
        }
        ret += aux;
 
        if (ret < sizeof(struct inotify_event)) {
            fprintf(stderr, "short of red bytes\n");
            exit(EXIT_FAILURE);
        }
 
        i = 0;
        while (i < ret) {
            struct inotify_event *inotify_p;
            inotify_p = (struct inotify_event *)(buffer + i);
 
            if (ret < i + offsetof(struct inotify_event, name)) {
                aux = ret - i;
                memmove(buffer, buffer + i, aux);
                goto reread;
            }
 
            int size = sizeof(struct inotify_event) + inotify_p->len;
            if (ret < i + size) {
                aux = ret - i;
                memmove(buffer, buffer + i, aux);
                goto reread;
            }
            if ( strstr(inotify_p->name , ".mrc" ) != NULL ){
               printf("dorun.sh %s\n",inotify_p->name );
            }
            i += size;
        }
    }
    close(fd);
    return 0;
}

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-05-11 (木) 23:22:30 (14d)