Гость Опубликовано 16 января, 2002 Жалоба Опубликовано 16 января, 2002 Пытаюсь сделать из программы miniterm ( терминальная программа для работы с асинхронными портами, модемами, и т.д. ) такую чтобы могла писать данные поступающие из /dev/ttyS0 в файл лога в фоновом режиме. Когда после компиляции запускаю её: miniterm & и нажимаю ENTER, происходит следующее: [root@remote lpg-0.4.examples]# `pwd`/miniterm & [1] 28333 [root@remote lpg-0.4.examples]# Здесь нажимаю Enter [1]+ Stopped `pwd`/miniterm [root@remote lpg-0.4.examples]# И никакого лога не пишется. Если запускаю без фонового режима, лог пишется, но консоль навсегда занята этой программой. Помогите ! как правильно писать лог в фоновом режиме ? Максим. Цитата
Гость Опубликовано 16 января, 2002 Жалоба Опубликовано 16 января, 2002 Пытаюсь сделать из программы miniterm ( терминальная программа для работы с асинхронными портами, модемами, и т.д. ) такую чтобы могла писать данные поступающие из /dev/ttyS0 в файл лога в фоновом режиме. Когда после компиляции запускаю её: miniterm & и нажимаю ENTER, происходит следующее: [root@remote lpg-0.4.examples]# `pwd`/miniterm & [1] 28333 [root@remote lpg-0.4.examples]# Здесь нажимаю Enter [1]+ Stopped `pwd`/miniterm [root@remote lpg-0.4.examples]# И никакого лога не пишется. Если запускаю без фонового режима, лог пишется, но консоль навсегда занята этой программой. Помогите ! как правильно писать лог в фоновом режиме ? Максим. Цитата
Гость Опубликовано 17 марта, 2002 Жалоба Опубликовано 17 марта, 2002 Когда программа уходит в фоновый режим (это если насовсем, если временно - см. man fg, man bg, man jobs), она должна "демонизироваться" - отвязаться от управляющего терминала и пр. Иначе она нормально работать не будет и быстро умрет. Делается это приблизительно так: void main() { // Игнорируем "ненужные" сигналы signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTSTP, SIG_IGN); if (fork() != 0) exit(0); // Fork setsid(); // Становимся лидером новой сессии // закрываем все открытые файлы // Можно просто "close(0);close(1);close(2);" // - обычно этого достаточно rlimit flim; getrlimit(RLIMIT_NOFILE, &flim); for (int fd = 0; fd < flim.rlim_max; fd++) close(fd); chdir("/"); // текущий каталог - корень // лишь в его существовании мы можем быть уверены // Пошли заниматься своими прямыми обязанностями YourFunction(); exit(0); // На всякий случай } Цитата
Гость Опубликовано 17 марта, 2002 Жалоба Опубликовано 17 марта, 2002 Когда программа уходит в фоновый режим (это если насовсем, если временно - см. man fg, man bg, man jobs), она должна "демонизироваться" - отвязаться от управляющего терминала и пр. Иначе она нормально работать не будет и быстро умрет. Делается это приблизительно так: void main() { // Игнорируем "ненужные" сигналы signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTSTP, SIG_IGN); if (fork() != 0) exit(0); // Fork setsid(); // Становимся лидером новой сессии // закрываем все открытые файлы // Можно просто "close(0);close(1);close(2);" // - обычно этого достаточно rlimit flim; getrlimit(RLIMIT_NOFILE, &flim); for (int fd = 0; fd < flim.rlim_max; fd++) close(fd); chdir("/"); // текущий каталог - корень // лишь в его существовании мы можем быть уверены // Пошли заниматься своими прямыми обязанностями YourFunction(); exit(0); // На всякий случай } Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.