Vi/Vim write file

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Pal
мл. сержант
Сообщения: 97
Зарегистрирован: 2008-07-04 14:40:14

Vi/Vim write file

Непрочитанное сообщение Pal » 2008-10-16 23:01:43

Здравствуйте.
Необходимо следить за файлом, в случае его изменения сообшать об этом.

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

#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 и какой может быть выход из этой ситуации.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

MAK
ст. сержант
Сообщения: 344
Зарегистрирован: 2008-09-17 2:23:21

Re: Vi/Vim write file

Непрочитанное сообщение MAK » 2008-10-17 13:03:12

vim бэкапит файл в file_name.swp - отсюда и rename и delete

Pal
мл. сержант
Сообщения: 97
Зарегистрирован: 2008-07-04 14:40:14

Re: Vi/Vim write file

Непрочитанное сообщение Pal » 2008-10-17 23:21:31

Ставлю опции:
:set noswapfile
:set nobackup
Результат тот же...

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Vi/Vim write file

Непрочитанное сообщение paradox » 2008-10-18 13:09:45

если надобность следить именно за действиями вима
тогда проще покопаться в его исходниках