Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Пытаюсь сделать из программы 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]#

И никакого лога не пишется. Если запускаю без фонового режима, лог пишется, но консоль навсегда занята этой программой.

Помогите ! как правильно писать лог в фоновом режиме ?

Максим.

Опубликовано

Пытаюсь сделать из программы 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]#

И никакого лога не пишется. Если запускаю без фонового режима, лог пишется, но консоль навсегда занята этой программой.

Помогите ! как правильно писать лог в фоновом режиме ?

Максим.

  • 2 месяца спустя...
Опубликовано

Когда программа уходит в фоновый режим (это если насовсем, если временно - см. 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("/"); // текущий каталог - корень

// лишь в его существовании мы можем быть уверены

// Пошли заниматься своими прямыми обязанностями Smile

YourFunction();

exit(0); // На всякий случай Wink

}

Опубликовано

Когда программа уходит в фоновый режим (это если насовсем, если временно - см. 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("/"); // текущий каталог - корень

// лишь в его существовании мы можем быть уверены

// Пошли заниматься своими прямыми обязанностями Smile

YourFunction();

exit(0); // На всякий случай Wink

}

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...