Как процесс C / C ++ может узнать, работает ли он в фоновом режиме? - PullRequest
4 голосов
/ 15 октября 2010

У меня есть метод в моем процессе, который должен выполняться, только если процесс не находится в фоновом режиме. Как я могу динамически проверить, если текущий процесс находится в фоновом режиме? Спасибо

Ответы [ 4 ]

5 голосов
/ 15 октября 2010

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

/* We can read from stdin if :
 * - we are in foreground
 * - stdin is a pipe end
 */
static int validate_stdin(void) {
    pid_t fg = tcgetpgrp(STDIN_FILENO);
    int rc = 0;
    if(fg == -1) {
        debug_printf("Piped\n");
    }  else if (fg == getpgrp()) {
        debug_printf("foreground\n");
    } else {
        debug_printf("background\n");
        rc = -1;
    }
    return rc;
}

Если в сеансе имеется управляющий терминал, на переднем плане может быть только группа процессов, а tcget / setpgrp используется для установки этого идентификатора группы процессов. Поэтому, если идентификатор вашей группы процессов не является идентификатором группы процессов группы процессов переднего плана, то вы не находитесь на переднем плане.

Работает, если в оболочке есть управление заданиями, как говорит ссылка, указанная mouviciel. Однако это не всегда так. Например, во встроенной системе с использованием busybox оболочка может быть настроена с управлением заданиями или без него.

3 голосов
/ 15 октября 2010

Ознакомьтесь с FAQ по Unix: Как процесс может определить, работает ли он в фоновом режиме?

Общий ответ таков: вы не можете определить, работает ли он в фоновом режиме.

Но вы можете проверить, является ли stdin терминалом: if(isatty(0)) { ... }

0 голосов
/ 15 октября 2010

Звучит как плохой дизайн. Можете ли вы рассказать нам что-нибудь об этом методе, который вы упоминаете в своем вопросе? Как сказал mouviciel , надежного пути нет.

Одно из предложений, которое у меня есть, - это использовать «поведение переднего плана» по умолчанию и сохранять «поведение фона» под переключателем, например -d (для режима демона) или наоборот, если ваша программа обычно работает в фоновом режиме. Одним из примеров такого использования является fetchmail .

0 голосов
/ 15 октября 2010

Попробуйте проверить наличие ДИСПЛЕЯ.Там показан исходный код команды xset Как проверить, не содержит ли заставка консоли Linux пустой экран

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