Как сделать чтобы программа остановилась и ждала пока в файл не произойдет запись извне как в случае с именованным каналом?
У меня при считывании конца файла программа продолжает работу, прихродится впустую считывать файл много раз в цикле.
open FILE, "<$FILE";
while ( sleep 1 ) {
while ( $fromparent=<FILE>) {
print $client "$fromparent\x1B[0;32m";
}
}
"sleep 1" очень замедляет реакцию программы.
Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.
>[оверквотинг удален]
>файл много раз в цикле.
> open FILE, "<$FILE";
> while ( sleep 1 ) {
> while ( $fromparent=<FILE>) {
> print $client "$fromparent\x1B[0;32m";
> }
> }
>"sleep 1" очень замедляет реакцию программы.
>Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.
>1) перенаправить вывод программы не в файл, а на stdin твоего скрипта (или воспользоваться tee)
2) ммм скаежм tail снимать конец файла и ловить на stdin
tail -n 0 -f file > you_script (както так)
но встает бааальшой вопрос - как завершить прогу?
>1) перенаправить вывод программы не в файл, а на stdin твоего скриптаБоюсь так не получится, потому что из этого файла должны читать несколько скриптов не мешая друг другу, на stdin можно перенаправить только для одного.
>2) ммм скаежм tail снимать конец файла и ловить на stdin
> tail -n 0 -f file > you_script (както так)Не понял, что это и как работает? tail будет ожидать вывода в файл? Я думал он просто считывает хвост файла. Нужно считывать из файла без повторов и без дублей.
> но встает бааальшой вопрос - как завершить прогу?
kill перестанет работать? Снова не понял что вы имеете в виду.
tail -n 0 -f you_file | you_script_1 &
tail -n 0 -f you_file | you_script_2 &
tail -n 0 -f you_file | you_script_3 &
...>Не понял, что это и как работает? tail будет ожидать вывода в
>файл? Я думал он просто считывает хвост файла. Нужно считывать из
>файла без повторов и без дублей.man tail
>> но встает бааальшой вопрос - как завершить прогу?
>kill перестанет работать? Снова не понял что вы имеете в виду.в том то и дело для тейлы быдут висеть пока не получаль сигнал
>man tailСпасибо, это дало лучший результат чем yandex tail!
>в том то и дело для тейлы быдут висеть пока не получаль
>сигналПредполагалось что программа будет завершаться по команде "здохни", записанной в файл. Теоретически тэйл нормально должен отработать, так? И нельзя ли на перле реализовать тот механизм, который делает внешняя программа тэйл? Большие требования к оптимизации использования памяти, количества запущенных процессов и использования процессорного времени...
> Большие требования к оптимизации
> использования памяти, количества запущенных процессов и использования процессорного
> времени...тыб лучши изложил задачу с самого начала, а то есть очень сильные подозрения что ты херней страдаешь и роешь не в ту сторону ...
>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>подозрения что ты херней страдаешь и роешь не в ту сторону
>...Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер эти же данные дублирует всем клиентам, в итоге происходит обмен данными между клиентами.
>>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>>подозрения что ты херней страдаешь и роешь не в ту сторону
>>...
>
>Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер
>эти же данные дублирует всем клиентам, в итоге происходит обмен данными
>между клиентами.эээээ ... а причем тут файл ))
>>>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>>>подозрения что ты херней страдаешь и роешь не в ту сторону
>>>...
>>
>>Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер
>>эти же данные дублирует всем клиентам, в итоге происходит обмен данными
>>между клиентами.
>
>эээээ ... а причем тут файл ))Ты просил изложить с самого начала :)
Для обслуживания каждого подключившегося клиента ответвляется дочерний сервер.
>>сервер эти же данные дублирует всем клиентам,В этом месте и используется файл. главный сервер записывает данные в файл, из которого потом дочерние серверы считывают эти данные и отправляют куда надо.
>[оверквотинг удален]
>>
>>эээээ ... а причем тут файл ))
>
>Ты просил изложить с самого начала :)
>Для обслуживания каждого подключившегося клиента ответвляется дочерний сервер.
>>>сервер эти же данные дублирует всем клиентам,
>
>В этом месте и используется файл. главный сервер записывает данные в файл,
>из которого потом дочерние серверы считывают эти данные и отправляют куда
>надо.ээээ аааа кагбыыыыы нельзя это делать например через сокет ? :))
Через сокет сообщение получит только один процесс, который последним использовал этот сокет. :р
>Через сокет сообщение получит только один процесс, который последним использовал этот сокет.
>:рx_X - по моему ты бредишь .......
"локальный unix-сокет" тебе о чемнидь говорит?
>x_X - по моему ты бредишь .......
>"локальный unix-сокет" тебе о чемнидь говорит?ммм..... да. Это ничего не меняет. Если думаешь что я не прав, пиши прямо, лучше с примером.
>>x_X - по моему ты бредишь .......
>>"локальный unix-сокет" тебе о чемнидь говорит?
>
>ммм..... да. Это ничего не меняет. Если думаешь что я не прав,
>пиши прямо, лучше с примером.mysql.sock как пример )
локальные клиенты могут ходить через него ))
>mysql.sock как пример )
>локальные клиенты могут ходить через него ))Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу нескольким процессам?
>>mysql.sock как пример )
>>локальные клиенты могут ходить через него ))
>
>Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу
>нескольким процессам?да это файл!!! но спец типа, который по идее какбы не файл ...
это называется локальный сокет!
>>>mysql.sock как пример )
>>>локальные клиенты могут ходить через него ))
>>
>>Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу
>>нескольким процессам?
>
>да это файл!!! но спец типа, который по идее какбы не файл
>...
>это называется локальный сокет!Если это работает так же как именоваванный канал, то не получилось, я так уже пробовал. Если это другое, покажи как его создать и использовать?
>[оверквотинг удален]
>файл много раз в цикле.
> open FILE, "<$FILE";
> while ( sleep 1 ) {
> while ( $fromparent=<FILE>) {
> print $client "$fromparent\x1B[0;32m";
> }
> }
>"sleep 1" очень замедляет реакцию программы.
>Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.
>может быть inotify или dnotify (я не помню кто из них кого заменил) вам поможет.
>может быть inotify или dnotify (я не помню кто из них кого
>заменил) вам поможет.Спасибо! Возможно так и есть, почитаю.
>[оверквотинг удален]
>файл много раз в цикле.
> open FILE, "<$FILE";
> while ( sleep 1 ) {
> while ( $fromparent=<FILE>) {
> print $client "$fromparent\x1B[0;32m";
> }
> }
>"sleep 1" очень замедляет реакцию программы.
>Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.
>Можешь использовать Multiplexed I/O, т.е. select, poll, epoll, kqueue... Вот пример из книги Роберта Лава с select (вместо STDIN_FILENO может быть любой другой файловый дескриптор):
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>#define TIMEOUT 5 /* select timeout in seconds */
#define BUF_LEN 1024 /* read buffer in bytes */int main (void)
{
struct timeval tv;
fd_set readfds;
int ret;
/* Wait on stdin for input. */
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
/* Wait up to five seconds. */
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
/* All right, now block! */
ret = select (STDIN_FILENO + 1,
&readfds,
NULL,
NULL,
&tv);
if (ret == -1) {
perror ("select");
return 1;
} else if (!ret) {
printf ("%d seconds elapsed.\n", TIMEOUT);
return 0;
}
/*
* Is our file descriptor ready to read?
* (It must be, as it was the only fd that
* we provided and the call returned
* nonzero, but we will humor ourselves.)
*/
if (FD_ISSET(STDIN_FILENO, &readfds)) {
char buf[BUF_LEN+1];
int len;
/* guaranteed to not block */
len = read (STDIN_FILENO, buf, BUF_LEN);
if (len == -1) {
perror ("read");
return 1;
}
if (len) {
buf[len] = '\0';
printf ("read: %s\n", buf);
}
return 0;
}
fprintf (stderr, "This should not happen!\n");
return 1;
}
Блин, извиняюсь, я только прочитал текст твоего сообщения, а на код не посмотрел, почему-то был уверен что это C.
>Блин, извиняюсь, я только прочитал текст твоего сообщения, а на код не
>посмотрел, почему-то был уверен что это C.Ничего страшного. Может быть это как раз то что нужно, сейчас читаю про Multiplexing filehandles with select() in perl.