URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8600
[ Назад ]

Исходное сообщение
"Ожидание записи в файл другим процессом"

Отправлено D_Pavel , 26-Янв-10 07:28 
Как сделать чтобы программа остановилась и ждала пока в файл не произойдет запись извне как в случае с именованным каналом?
У меня при считывании конца файла программа продолжает работу, прихродится впустую считывать файл много раз в цикле.
    open FILE, "<$FILE";
    while ( sleep 1 ) {
        while ( $fromparent=<FILE>) {
            print $client "$fromparent\x1B[0;32m";
        }
    }
"sleep 1" очень замедляет реакцию программы.
Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.

Содержание

Сообщения в этом обсуждении
"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 26-Янв-10 09:56 
>[оверквотинг удален]
>файл много раз в цикле.
> 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 (както так)
   но встает бааальшой вопрос - как завершить прогу?


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 26-Янв-10 10:10 
>1) перенаправить вывод программы не в файл, а на stdin твоего скрипта

Боюсь так не получится, потому что из этого файла должны читать несколько скриптов не мешая друг другу, на stdin можно перенаправить только для одного.

>2) ммм скаежм tail снимать конец файла и ловить на stdin
>   tail -n 0 -f file > you_script (както так)

Не понял, что это и как работает? tail будет ожидать вывода в файл? Я думал он просто считывает хвост файла. Нужно считывать из файла без повторов и без дублей.

>   но встает бааальшой вопрос - как завершить прогу?

kill перестанет работать? Снова не понял что вы имеете в виду.


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 26-Янв-10 13:09 
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 перестанет работать? Снова не понял что вы имеете в виду.

в том то и дело для тейлы быдут висеть пока не получаль сигнал



"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 26-Янв-10 13:28 
>man tail

Спасибо, это дало лучший результат чем yandex tail!

>в том то и дело для тейлы быдут висеть пока не получаль
>сигнал

Предполагалось что программа будет завершаться по команде "здохни", записанной в файл. Теоретически тэйл нормально должен отработать, так? И нельзя ли на перле реализовать тот механизм, который делает внешняя программа тэйл? Большие требования к оптимизации использования памяти, количества запущенных процессов и использования процессорного времени...


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 26-Янв-10 17:57 
> Большие требования к оптимизации
> использования памяти, количества запущенных процессов и использования процессорного
> времени...

тыб лучши изложил задачу с самого начала, а то есть очень сильные подозрения что ты херней страдаешь и роешь не в ту сторону ...


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 06:12 
>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>подозрения что ты херней страдаешь и роешь не в ту сторону
>...

Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер эти же данные дублирует всем клиентам, в итоге происходит обмен данными между клиентами.


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 27-Янв-10 07:58 
>>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>>подозрения что ты херней страдаешь и роешь не в ту сторону
>>...
>
>Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер
>эти же данные дублирует всем клиентам, в итоге происходит обмен данными
>между клиентами.

эээээ ... а причем тут файл ))


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 08:04 
>>>тыб лучши изложил задачу с самого начала, а то есть очень сильные
>>>подозрения что ты херней страдаешь и роешь не в ту сторону
>>>...
>>
>>Сервер слушает сокет и принимает клиентов, любой клиент посылают данные серверу, сервер
>>эти же данные дублирует всем клиентам, в итоге происходит обмен данными
>>между клиентами.
>
>эээээ ... а причем тут файл ))

Ты просил изложить с самого начала :)
Для обслуживания каждого подключившегося клиента ответвляется дочерний сервер.
>>сервер эти же данные дублирует всем клиентам,

В этом месте и используется файл. главный сервер записывает данные в файл, из которого потом дочерние серверы считывают эти данные и отправляют куда надо.


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 27-Янв-10 08:46 
>[оверквотинг удален]
>>
>>эээээ ... а причем тут файл ))
>
>Ты просил изложить с самого начала :)
>Для обслуживания каждого подключившегося клиента ответвляется дочерний сервер.
>>>сервер эти же данные дублирует всем клиентам,
>
>В этом месте и используется файл. главный сервер записывает данные в файл,
>из которого потом дочерние серверы считывают эти данные и отправляют куда
>надо.

ээээ аааа кагбыыыыы нельзя это делать например через сокет ? :))


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 09:17 
Через сокет сообщение получит только один процесс, который последним использовал этот сокет. :р

"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 27-Янв-10 10:19 
>Через сокет сообщение получит только один процесс, который последним использовал этот сокет.
>:р

x_X - по моему ты бредишь .......
"локальный unix-сокет" тебе о чемнидь говорит?


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 10:40 
>x_X - по моему ты бредишь .......
>"локальный unix-сокет" тебе о чемнидь говорит?

ммм..... да. Это ничего не меняет. Если думаешь что я не прав, пиши прямо, лучше с примером.


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 27-Янв-10 12:20 
>>x_X - по моему ты бредишь .......
>>"локальный unix-сокет" тебе о чемнидь говорит?
>
>ммм..... да. Это ничего не меняет. Если думаешь что я не прав,
>пиши прямо, лучше с примером.

mysql.sock как пример )
локальные клиенты могут ходить через него ))


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 12:30 
>mysql.sock как пример )
>локальные клиенты могут ходить через него ))

Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу нескольким процессам?


"Ожидание записи в файл другим процессом"
Отправлено Pahanivo , 28-Янв-10 09:38 
>>mysql.sock как пример )
>>локальные клиенты могут ходить через него ))
>
>Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу
>нескольким процессам?

да это файл!!! но спец типа, который по идее какбы не файл ...
это называется локальный сокет!


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 29-Янв-10 11:59 
>>>mysql.sock как пример )
>>>локальные клиенты могут ходить через него ))
>>
>>Это вроде какой-то файл? Так ничего не понятно. Как передать данные сразу
>>нескольким процессам?
>
>да это файл!!! но спец типа, который по идее какбы не файл
>...
>это называется локальный сокет!

Если это работает так же как именоваванный канал, то не получилось, я так уже пробовал. Если это другое, покажи как его создать и использовать?


"Ожидание записи в файл другим процессом"
Отправлено Andrey , 26-Янв-10 11:31 
>[оверквотинг удален]
>файл много раз в цикле.
> open FILE, "<$FILE";
> while ( sleep 1 ) {
>        while ( $fromparent=<FILE>) {
>   print $client "$fromparent\x1B[0;32m";
>  }
> }
>"sleep 1" очень замедляет реакцию программы.
>Если "sleep" убрать, то процессор грузится на 100%, а это не приемлемо.
>

может быть inotify или dnotify (я не помню кто из них кого заменил) вам поможет.


"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 08:17 
>может быть inotify или dnotify (я не помню кто из них кого
>заменил) вам поможет.

Спасибо! Возможно так и есть, почитаю.


"Ожидание записи в файл другим процессом"
Отправлено Аноним , 26-Янв-10 22:05 
>[оверквотинг удален]
>файл много раз в цикле.
> 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;
}


"Ожидание записи в файл другим процессом"
Отправлено Аноним , 26-Янв-10 22:08 
Блин, извиняюсь, я только прочитал текст твоего сообщения, а на код не посмотрел, почему-то был уверен что это C.

"Ожидание записи в файл другим процессом"
Отправлено D_Pavel , 27-Янв-10 06:29 
>Блин, извиняюсь, я только прочитал текст твоего сообщения, а на код не
>посмотрел, почему-то был уверен что это C.

Ничего страшного. Может быть это как раз то что нужно, сейчас читаю про Multiplexing filehandles with select() in perl.