[FUG-BR] OT - Monitorar alterações de arquivo

Thiago Damas tdamas em gmail.com
Sexta Junho 9 21:56:29 BRT 2006


  Certo dia, recebi um arquivo na lista freebsd-hackers, que funcionou
muito bem; testei algumas vezes, funcionou OK, e tenho ele guardado na
manga para caso alguem dia utilize; bem, chegou o dia:
  compile usando: gcc -o fwatch fwatch.c

fwatch.c
------------------------------------------------------------------------------------------------
/*
 * Copyright (c) 2003-2004 Daichi GOTO <daichi at ongs.co.jp>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <sys/types.h>
#include <sys/event.h>

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sysexits.h>
#include <time.h>

#define kevent_add(kq, ev) kevent((kq), (ev), 1, NULL, 0, NULL)
#define kevent_poll(kq, ev) kevent((kq), NULL, 0, (ev), 1, NULL)

static void     usage(void);
static void     addwatchfile(int, int);
static void     watchfile(int);

int
main(int argc, char *argv[])
{
        int             kq;
        int             filedesc;
        int             count;

        if (2 > argc) {
                usage();
                exit(EX_USAGE);
        }

        kq = kqueue();

        for (count = 1; count < argc; count++) {
                filedesc = open(argv[count], O_RDONLY);
                if (-1 == filedesc) {
                        fprintf(stderr,
                                "error: cannot open file: %d\n", errno);
                        exit(EX_NOINPUT);
                }
                addwatchfile(kq, filedesc);
        }

        watchfile(kq);

        exit(EX_OK);
}

static void
usage(void)
{
        fprintf(stderr, "usage: fwatch files...\n");
}

static void
addwatchfile(int kq, int filedesc)
{
        struct kevent   event;

        EV_SET(&event, filedesc,
               EVFILT_VNODE,
               EV_ADD | EV_ENABLE | EV_CLEAR,
               NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
NOTE_RENAME, 0, 0);

        kevent_add(kq, &event);
}

static void
watchfile(int kq)
{
        struct kevent   event;

        kevent_poll(kq, &event);
}
------------------------------------------------------------------------------------------------

On 6/9/06, Pedro Henrique Morsch Mazzoni <phmazzoni at gmail.com> wrote:
> Olá pessoal,
>
> Estou procurando um modo de rodar um script sempre que um arquivo
> determinado seja alterado.
> Preciso de algo que não ocupe CPU ( loops :) ). Também não pode ser o FAM.
> Alguma dica?
>
> Grato,
> Pedro MAzzoni
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>


Mais detalhes sobre a lista de discussão freebsd