The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Ожидание записи в файл другим процессом, !*! 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, 09:56 , 26-Янв-10 (1)
    >[оверквотинг удален]
    >файл много раз в цикле.
    > 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, 10:10 , 26-Янв-10 (2) +1
      >1) перенаправить вывод программы не в файл, а на stdin твоего скрипта

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

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

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

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

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

      • Ожидание записи в файл другим процессом, !*! Pahanivo, 13:09 , 26-Янв-10 (4)
        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, 13:28 , 26-Янв-10 (5) +1
          >man tail

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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