Цикл или чтото другое?
Модератор: Fastman
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Цикл или чтото другое?
Необходимо, к примеру, периодически опрашивать размер файла (лога), если размер изменяется, то производим занесение содержимого в базу данных , файл обнуляем и снова проверяем размер.
Каким образом можно реализовать? У меня есть мысли пока только с помощью цикла, но такой вариант даёт большую нагрузку на сервер и на жёсткий.
Каким образом можно реализовать? У меня есть мысли пока только с помощью цикла, но такой вариант даёт большую нагрузку на сервер и на жёсткий.
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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/
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
Код: Выделить всё
man kevent
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Спасибо за сверхбыстрый ответ , чувствую это на долго..
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Вот набросал такой код:
Как теперь после изменения файла вывести сообщение и заного проверять его на изменение, чтобы не выходить из цикла?
Код: Выделить всё
int main(int argc, char *argv[])
{
int kq = kqueue();
int fd = open("/home/file.txt", O_RDONLY);
struct kevent ke;
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD, NOTE_WRITE, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);
for (; ; )
{
if(ke.filter==EVFILT_VNODE && (ke.fflags&NOTE_WRITE))
{
cout << "File was Writed!\n";
return 0;
}
}
return 0;
}
-
- мл. сержант
- Сообщения: 73
- Зарегистрирован: 2008-08-19 15:09:19
Re: Цикл или чтото другое?
а зачем в цикле return?
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Ну вот я про это и спрашиваю, если убрать return, то выход из цикла не будет произведён, а начнёт постоянно выводиться сообщение "File was Writed!".
Надо как то обновить флаги и начать заного проверять файл на изменение.
Надо как то обновить флаги и начать заного проверять файл на изменение.
-
- мл. сержант
- Сообщения: 73
- Зарегистрирован: 2008-08-19 15:09:19
Re: Цикл или чтото другое?
или
while(1) {
//здесь проверяешь размер файла
sleep(1);
};
while(1) {
//здесь проверяешь размер файла
sleep(1);
};
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
неправильный код
ты вообще не тот цикл крутишь
крутить нужно kevent
и man kevent
на возращаемые значения
ты вообще не тот цикл крутишь
крутить нужно kevent
и man kevent
на возращаемые значения
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Приведи пример, если не сложно, я пока испытываю большие сложности с чтением man`ов.
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
Код: Выделить всё
int main(int argc, char *argv[])
{
int kq = kqueue();
int fd = open("/home/file.txt", O_RDONLY);
struct kevent ke;
int res;
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD, NOTE_WRITE, 0, NULL);
res = kevent(kq, &ke, 1, NULL, 0, NULL);
for (; ; )
{
res = kevent(kq, .....) паметры из мануала
// вот сдесь нужно проверять значение res
// и в зависимости от него выходить из программы или делать свои действия
if(ke.filter==EVFILT_VNODE && (ke.fflags&NOTE_WRITE))
{
cout << "File was Writed!\n";
return 0;
}
}
return 0;
}
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Всё сделал, работает, но почему сообщение "File was Writed!" выводится 2 раза?
Вот код:
Вот код:
Код: Выделить всё
int main(int argc, char *argv[])
{
int res;
int kq = kqueue();
int fd = open("/home/file.txt", O_RDONLY);
struct kevent ke;
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
kevent(kq, &ke, 1, NULL, 0, NULL);
for (;;)
{
res = kevent(kq, NULL, 0, &ke, 1, NULL);
if(res>0 && (ke.fflags & NOTE_WRITE))
{
cout << "File was Writed!\n";
}
}
return 0;
}
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
а как вы в файл пишете?
возможно потому что открытие дексриптора на запись это первая запись
и запись данных это вторая запись
возможно потому что открытие дексриптора на запись это первая запись
и запись данных это вторая запись
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Я просто открываю файл редактором ее, изменяю его и закрываю. В момент закрытия и сохранения выскакивает двойное сообщение.
Последний раз редактировалось mihan_k 2009-08-26 21:54:28, всего редактировалось 2 раза.
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
ну значит ee два раза пишет
попробуйте простой
должно поидеи один раз сработать
попробуйте простой
Код: Выделить всё
echo "ddddd" >> file.txt
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Всё, извиняюсь, открывал при помощи mc F4, и при сохранении было двойное сообщение, а с ее всё ок.
Спасибо за помощь.
Спасибо за помощь.
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Продолжу тему, интересует такой вопрос: каким образом я могу в той же программе выполнять какие-либо ещё функции попутно, причём эти функции должны работать не дожидаясь срабатывания события res = kevent(kq, NULL, 0, &ke, 1, NULL);?
Код: Выделить всё
int main(int argc, char *argv[])
{
int res;
int kq = kqueue();
int fd = open("/home/file.txt", O_RDONLY);
struct kevent ke;
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
kevent(kq, &ke, 1, NULL, 0, NULL);
for (;;)
{
res = kevent(kq, NULL, 0, &ke, 1, NULL);
if(res>0 && (ke.fflags & NOTE_WRITE))
{
cout << "File was Writed!\n";
}
}
return 0;
}
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
установив таймаут ожидания kevent
man kevent
либо сделать дексриптор нонблок
man kevent
либо сделать дексриптор нонблок
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Получается, если установить таймаут, то можно упустить совершение события?
И можно поподробнее про дексриптор нонблок..
И можно поподробнее про дексриптор нонблок..
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
нетПолучается, если установить таймаут, то можно упустить совершение события?
с какой радости?
это ж не магазин в котором если ушел с очереди вернулся а уже все разобрали
это как стол заказов
заказал и можешь ждать можешь не ждать
но когда прийдешь оно или будет лежать тебя ждать
или небудет тогда его еще и не было
долго рассказыватьИ можно поподробнее про дексриптор нонблок..
попробуй погуглить
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Прикольно объясняешь , меня устроит первый вариант.
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Переделал немного программу, добавил комментариев, чтобы примерно показать, на сколько мне понятна работа kevent.
Вопрос состоит в следующем: как в процессе опроса событий добавлять ещё собития или удалять их, если они не нужны?
Если до инициализации Queue я составлял массив для опроса 2-3 файлов, то всё работает нормально, но когда уже программа работает, добавить новое событие не получается, так как всё сразу сбивается и опрос проходит неверно.
Вот код:
Вопрос состоит в следующем: как в процессе опроса событий добавлять ещё собития или удалять их, если они не нужны?
Если до инициализации Queue я составлял массив для опроса 2-3 файлов, то всё работает нормально, но когда уже программа работает, добавить новое событие не получается, так как всё сразу сбивается и опрос проходит неверно.
Вот код:
Код: Выделить всё
int main()
{
int kq,
iNum,
iNumRes,
fd,
res, /* результат, количество произошечших событий */
n;
kq = kqueue();
/* инициализируем структуры, знаем, что будем опрашивать всего 3 файла */
struct kevent kev[3], /* тут будем регистрировать события */
kevRes[3]; /* тут будем получать результаты от событий */
struct timespec ts = { 1,0 }; /* устанавливаем время ожидания события в одну сек. */
/* добавляем в описатели событий kev[0] и kev[1] последовательно 2 файла */
/* проверять будем только на запись в файл */
fd = open("/home/file1.txt", O_RDONLY);
EV_SET(&kev[0], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
fd = open("/home/file2.txt", O_RDONLY);
EV_SET(&kev[1], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
iNum=2; /* опрашиваем пока 2 события */
iNumRes=3; /* всего событий будет 3 */
int iNewFileExist=0; /* изначально 3-й файл не добавлен */
for(;;)
{
res = kevent(kq, kev, iNum, kevRes, iNumRes, &ts);
if(res>0)
{
for(n=0;n<res;n++)
{
if(kevRes[n].ident==kev[0].ident)) /* запись была произведена в file1.txt */
{
cout << "file1 was Writed!\n";
}
if(kevRes[n].ident==kev[1].ident)) /* запись была произведена в file2.txt */
{
cout << "file2 was Writed!\n";
}
if(iNewFileExist==1) /* если 3-й файл был подключен, его тоже проверяем */
if(kevRes[n].ident==kev[2].ident)) /* запись была произведена в file3.txt */
{
cout << "file3 was Writed!\n";
}
}
}
/* добавляем на проверку новый файл */
if(iNewFileExist==0)
{
fd = open("/home/file3.txt", O_RDONLY);
EV_SET(&kev[2], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
iNum++; /* увеличиваем количество проверяемых событий, теперь их 2 */
iNewFileExist=1; /* file3.txt добавлен на проверку */
}
}
return 0;
}
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
это всего лиш макросEV_SET(&kev[2], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, 0);
а действие будет токо после kevent(.....)
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
Всё получилось, оказывается не делал проверку на то, что файл уже удалён, из-за этого всё и сбивалось..
Ещё вопрос: обязательно ли делать 2 массива структур, чтобы в одном хранить сами события, а во второй выводить их результаты?
PS: как так набил больше 10 тыс. сообщений, а статус "проходил мимо" ))
Ещё вопрос: обязательно ли делать 2 массива структур, чтобы в одном хранить сами события, а во второй выводить их результаты?
PS: как так набил больше 10 тыс. сообщений, а статус "проходил мимо" ))
-
- проходил мимо
- Сообщения: 11620
- Зарегистрирован: 2008-02-21 18:15:41
Re: Цикл или чтото другое?
не понял насчет масива
а статус у меня персональный
а статус у меня персональный
-
- мл. сержант
- Сообщения: 70
- Зарегистрирован: 2009-01-27 15:44:27
Re: Цикл или чтото другое?
res = kevent(kq, kev, iNum, kevRes, iNumRes, &ts);
kev - содержит, допустим, 3 события, которые надо проверять.
kevRes - возвращаются результаты на происшедшие события.
Обязательно ли использовать kevRes или вместо него можно использовать kev?
kev - содержит, допустим, 3 события, которые надо проверять.
kevRes - возвращаются результаты на происшедшие события.
Обязательно ли использовать kevRes или вместо него можно использовать kev?