Страница 1 из 1

Vi/Vim write file

Добавлено: 2008-10-16 23:01:43
Pal
Здравствуйте.
Необходимо следить за файлом, в случае его изменения сообшать об этом.

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/event.h>


int
main(int argc, char * argv[])
{

        int fd, kq, kv; 
        struct kevent ke; 

        fd = open(argv[1], O_RDONLY, NULL);
        kq = kqueue();

        EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD|EV_CLEAR,  NOTE_WRITE | NOTE_DELETE | NOTE_EXTEND | NOTE_ATTRIB |
                        NOTE_LINK | NOTE_RENAME | NOTE_REVOKE, 0, NULL);
        kv = kevent(kq, &ke, 1, NULL, 0, NULL);

        while(1)
        {
                if ( kevent(kq, NULL, 0, &ke, 1, NULL) != -1 )
                {
                        printf("File has changed\n");
                        if (ke.fflags & NOTE_WRITE)
                        {
                                printf ("NOTE_WRITE\n");
                        };
                        if (ke.fflags & NOTE_DELETE)
                        {
                                printf ("NOTE_DELETE\n");
                        };
                        if (ke.fflags & NOTE_EXTEND)
                        {
                                printf ("NOTE_EXTEND\n");
                        };
                        if (ke.fflags & NOTE_ATTRIB)
                        {
                                printf ("NOTE_ATTRIB\n");
                        };
                        if (ke.fflags & NOTE_LINK)
                        {
                                printf ("NOTE_LINK\n");
                        };
                        if (ke.fflags & NOTE_RENAME)
                        {
                                printf ("NOTE_RENAME\n");
                        };
                        if (ke.fflags & NOTE_REVOKE)
                        {
                                printf ("NOTE_REVOKE\n");
                        };
                }
        }

        return 0;
}
В качестве аргумента указываем файл и получаем сообщения о том, что с ним происходит. При редактировании файла в любых редакторах, всё происходит отлично, но при редактировании в vim появляются проблемы:

Код: Выделить всё

./a.out man_kqueue 
File has changed
NOTE_RENAME
File has changed
NOTE_DELETE
Как будто vim при первом редактировании переименовывает его, а при втором удаляет. Получается если он удаляет старый файл и пишет новый, то я теряю файловый дескриптор.
Кто знает, подскажите что-же всё таки такое делает с файлом vim и какой может быть выход из этой ситуации.

Re: Vi/Vim write file

Добавлено: 2008-10-17 13:03:12
MAK
vim бэкапит файл в file_name.swp - отсюда и rename и delete

Re: Vi/Vim write file

Добавлено: 2008-10-17 23:21:31
Pal
Ставлю опции:
:set noswapfile
:set nobackup
Результат тот же...

Re: Vi/Vim write file

Добавлено: 2008-10-18 13:09:45
paradox
если надобность следить именно за действиями вима
тогда проще покопаться в его исходниках