Неканонический режим не работает на спине - PullRequest
0 голосов
/ 01 июля 2019

Когда я запускаю свою программу с помощью обратных символов, таких как:

cat `./my_program`

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

Вот мой код:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <term.h>
#include <strings.h>

int main()
{
    struct termios  term_setting;
    char            *term;
    char            buff[10];

    term = getenv("TERM");
    tgetent(NULL, term);
    tcgetattr(STDOUT_FILENO, &term_setting);    //
    term_setting.c_lflag &= ~(ICANON | ECHO);   //set my term in echo and non-canonique mode
    tcsetattr(STDOUT_FILENO, 0, &term_setting); //
    for (;;){
        bzero(buff, sizeof(char) * 10);
        read(STDIN_FILENO, buff, 9);
        printf("%s\n", buff);
    }
    return (0);
}

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Кажется, здесь есть некоторая путаница: что вы ожидаете

cat `./my_program`

для производства?

my_program копирует стандартный ввод в стандартный вывод в бесконечном цикле, даже послеДостигнув конца файла, который вы не тестируете, и получая неожиданный вывод.

Оболочка собирает этот вывод либо в файл, в псевдотерминал или, возможно, через канал и после завершения передает егоcat в качестве аргументов командной строки, но, поскольку для завершения вывода необходимо убить my_program, оболочка также прервет эту операцию.

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

Что касается изменения настроек терминала, вы можете использовать STDIN_FILENO или просто 0 вместо STDOUT_FILENO, так как вы хотите изменить поведение дескриптора ввода.

1 голос
/ 01 июля 2019

Ry- ♦ Скажите в комментарии: Because stdout isn’t the terminal anymore. Did you mean to get/set those attributes on STDIN_FILENO? Это точно моя проблема, спасибо!

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