The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Ожидание записи в файл другим процессом"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Ожидание записи в файл другим процессом"  +/
Сообщение от Pahanivo email(ok) on 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 (както так)
   но встает бааальшой вопрос - как завершить прогу?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от D_Pavel (ok) on 26-Янв-10, 10:10 
>1) перенаправить вывод программы не в файл, а на stdin твоего скрипта

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

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

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Ожидание записи в файл другим процессом"  +/
Сообщение от Pahanivo email(ok) on 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 перестанет работать? Снова не понял что вы имеете в виду.

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


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от D_Pavel (ok) on 26-Янв-10, 13:28 
>man tail

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

15. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от D_Pavel (ok) on 27-Янв-10, 09:17 
Через сокет сообщение получит только один процесс, который последним использовал этот сокет. :р
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от Andrey (??) on 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 (я не помню кто из них кого заменил) вам поможет.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от Аноним (??) on 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;
}

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Ожидание записи в файл другим процессом"  +1 +/
Сообщение от Аноним (??) on 26-Янв-10, 22:08 
Блин, извиняюсь, я только прочитал текст твоего сообщения, а на код не посмотрел, почему-то был уверен что это C.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру