запустить программу с необработанным режимом tcsetattr в фоновом режиме

Мне нужно запустить программу в фоновом режиме. Загвоздка в том, что программа выполняет вызов tcsetattr() и устанавливает необработанный режим следующим образом:

    struct termios tio;
    if (tcgetattr(fileno(stdin), &tio) == -1) {
            perror("tcgetattr");
            return;
    }
    _saved_tio = tio;
    tio.c_iflag |= IGNPAR;
    tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF);
    tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
    //      #ifdef IEXTEN
    tio.c_lflag &= ~IEXTEN;
    //      #endif
    tio.c_oflag &= ~OPOST;
    tio.c_cc[VMIN] = 1;
    tio.c_cc[VTIME] = 0;
    if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1)
            perror("tcsetattr");
    else
            _in_raw_mode = 1;

Подразумевается, что как только я запускаю свою программу с помощью «&» и нажимаю клавишу ввода, процесс показывает «остановлен». Даже выход ps aux показывает «T» как состояние процесса, что означает, что он не запущен. Как я могу заставить эту программу работать в фоновом режиме. Проблема в том, что я не могу изменить эту программу.

Для получения полной информации, на самом деле мне нужно использовать ipmitool с «sol» в качестве фонового процесса.

Любая помощь приветствуется! Спасибо


person Smash    schedule 18.11.2013    source источник


Ответы (1)


Трудно дать полный ответ о том, что происходит, не зная, как на самом деле используется/запускается ipmitool, но я попытаюсь добавить некоторые подробности. Таким образом, все параметры в вопросе необходимы для настройки ввода-вывода для программы (см. комментарии):

 // ignorance of errors of parity bit
tio.c_iflag |= IGNPAR;
// removed any interpretation of symbols (CR, NL) for input and control signals
tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF);
// switch off generation of signals for special characters, non-canonical mode is on,
// no echo, no reaction to kill character etc
tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
// removed recognition of some spec characters
//      #ifdef IEXTEN
tio.c_lflag &= ~IEXTEN;
//      #endif
// disable special impl-based output processing
tio.c_oflag &= ~OPOST;
// minimum number of characters to read in non-canonical mode
tio.c_cc[VMIN] = 1;
// timeout -> 0
tio.c_cc[VTIME] = 0;
// accurately make all the adjustments then it will be possible
if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1)
        perror("tcsetattr");
else
        _in_raw_mode = 1;

Дополнительные сведения о настройке терминала см. здесь и здесь. Другими словами, эта часть кода настраивает стандартный ввод процесса в «полностью тихий» или «необработанный» режим.
Несмотря на отсутствие информации, вы также можете попробовать «kill -cont %PID%», чтобы процесс или попытаться предоставить какой-либо файл в качестве стандартного ввода для него.

person Michael    schedule 18.11.2013