Как найти местоположение кода, которое заставляет приложение получать SIGTTIN под Linux? - PullRequest
0 голосов
/ 29 мая 2019

Одно из моих приложений на c ++ зависнет после запуска в течение неопределенного периода времени, поскольку оно не завершено, поэтому его нельзя перезапустить родительским процессом.

Известно, что SIGTTIN может предотвратить приостановку программы с помощью nohup или с помощью </dev/null для перенаправления стандартного ввода, но это принципиально не решает проблему.

Итак, кто-нибудь знает, как отладить или определить местоположение кода, генерирующего сигнал SIGTTIN?

// this is a example, exec command to get SIGTTIN: ./a.out &
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int main(int argc, char* argv[]) {
        int len;
        char buf[64];

        while(1) {
                len = read(STDIN_FILENO, buf, 64);
                if (len > 0) {
                        write(STDOUT_FILENO, buf, len);
                }
                else {
                        perror("read");
                }
        }
        return 0;
}

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

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

С https://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html:

Макрос: int SIGTTIN

Процесс не может читать с терминала пользователя, пока он работает как фоновое задание.Когда какой-либо процесс в фоновом задании пытается прочитать с терминала, всем процессам в задании отправляется сигнал SIGTTIN.Действие по умолчанию для этого сигнала - остановить процесс.Для получения дополнительной информации о том, как это взаимодействует с драйвером терминала, см. Доступ к терминалу.

найдите местоположение кода, который генерирует сигнал SIGTTIN?

Это прочитать

0 голосов
/ 31 мая 2019

Спасибо всем за ваш ответ.Проблема была решена.

Иногда я знаю причину SIGTTIN, но не могу найти код, вызвавший ошибку.Например, программа напрямую не использует системные вызовы scanf, read(0, ...), cin, ... или библиотечные функции, которые более заметны, когда программа больше или использует несколько потоков.

Вот как найти расположение кода, которое вызывает SIGTTIN:

  • Используйте ps для запроса pid вашей программы (если вам нужно отладить поток, вы можете использовать ps -eLfчтобы получить информацию).
  • Используйте strace -p $(YOUR PID) -e read для отслеживания системного вызова программы.При необходимости добавьте параметр -v.Если вы хотите отслеживать процесс и все его подпотоки, чтобы найти код, используйте Strace -fp $(YOUR PID) -e read. Когда программа выполняется в фоновом режиме, все вызовы read(0, ..., ...) могут вызывать SIGTTIN.В соответствии с параметрами или возвращаемыми значениями read(0, ..., ...), соответствующий код можно найти в позиции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...