[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