LINUX.ORG.RU

Секс с termios

 ,


0

1

Здравствуйте.

Есть один ман (man 3 termios). В нем определятеся структура с опциями последовательного интерфейса:

tcflag_t c_iflag; /* input modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes */
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* special characters */

Флагов для этих опций там штук сто не меньше.

И есть функция cfmakeraw(), которая:

sets the terminal to something like the «raw» mode of the old Version 7 terminal driver: input is available character by character, echoing is disabled, and all special processing of terminal input and output characters is disabled. The terminal attributes are set as follows:

termios_p−>c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
termios_p−>c_oflag &= ~OPOST;
termios_p−>c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p−>c_cflag &= ~(CSIZE | PARENB);
termios_p−>c_cflag |= CS8;

А волнует меня вот что. Функция cfmakeraw() отключает лишь несколько флагов. А реально флагов намного больше. А вдруг флаги, которые данная функция не отключила, будут влиять на input/output и он таки не будет raw?

Также в одной програме видел вот такое решение:

/* Output options - none = raw */
s_options.c_oflag = 0;

/* Local options - raw input, no clever processing, no echo */
s_options.c_lflag = 0;

Правильно ли так поступать? Нет ли в этом решении каких-то подводных камней

★★★★★

Последнее исправление: makoven (всего исправлений: 3)

Флагов для этих опций там штук сто не меньше.

меньше 60 даже с учётом не-POSIX.

А вдруг флаги, которые данная функция не отключила, будут влиять на input/output и он таки не будет raw?

Нет, достаточно прочитать этот man или man stty внимательно, чтобы убедиться, что прочие опции зависят от устанавливаемых/сбрасываемых.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Ясно. Спасибо. Значит тупо напишу makeraw и не буду изучать все эти флаги

makoven ★★★★★
() автор топика

cfmakeraw()

Прикольно. А я обычно свое велосипедил всегда:

    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    if(tcsetattr(STDIN_FILENO, TCSANOW, &newt) < 0) quit(-2);
    printf("\nOpen port...\n");
    if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
        fprintf(stderr,"Can't use port %s\n",comdev);
        quit(1);
    }

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от makoven

Дык, просто сравни. Ниже я привел код без cfmakeraw(). А вот как он выглядел бы с этой функцией:

    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    cfmakeraw(newt);
    printf("\nOpen port...\n");
    if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
        fprintf(stderr,"Can't use port %s\n",comdev);
        quit(1);
    }
Не сильно-то и сэкономили количество строк!

(newt оставил, т.к. не нашел в мане, изменяет ли свой аргумент эта функция).

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.