Обнаружение фоновой операции - PullRequest
4 голосов
/ 21 сентября 2009

В C как определить, что программа была вызвана в "фоновом режиме"? У меня есть программа, которую я хотел бы запустить в интерактивном режиме или в фоновом режиме.

Как я могу определить, что я не должен читать со стандартного ввода и заканчивать в состоянии "Остановлен: ввод tty"?

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

Редактировать: isatty кажется хорошей идеей, но что произойдет, если stdin - это конец канала, а не tty?

Ответы [ 2 ]

3 голосов
/ 21 сентября 2009

Используйте функцию tcgetpgrp() в файловом дескрипторе управляющего терминала (например, STDIN_FILENO или 0 для стандартного ввода), чтобы проверить, равна ли текущая группа процессов переднего плана вашей собственной группе процессов (из getpgrp()). Однако группа процессов переднего плана может измениться в любое время, поскольку ваша программа перемещается между передним планом и фоном. Например, он может измениться сразу после того, как вы позвоните tcgetpgrp() и до того, как вы его протестируете. Так что имейте это в виду, если вы собираетесь предпринять какие-либо действия, основанные на этом; это не надежный способ избежать SIGTTIN.

#include <unistd.h>
pid_t fg = tcgetpgrp(STDIN_FILENO);
if (fg == -1) {
    /* stdin is not controlling terminal (e.g. file, pipe, etc.) */
} else if (fg == getpgrp()) {
    /* foreground */
} else {
    /* background */
}
1 голос
/ 21 сентября 2009

1) Вы должны проверить, открыт ли stdin, и открыть / dev / null, если он закрыт.

2) Вы можете использовать isatty, который «возвращает 1, если desc - дескриптор открытого файла, подключенного к терминалу, и 0 в противном случае»

...