[РЕШЕНО]Не работает программа с использованием termios. (Чистый Си.)

Модератор: Модераторы разделов

Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

[РЕШЕНО]Не работает программа с использованием termios.

Сообщение Yaros »

Пытался вкурить в работу с termios, начал писать программку. Компилируется без ошибок, но работает не так, как задумано.
По идее, терминал должен настраиваться так, чтобы фразы "Start working" не было видно, однако этого не происходит.
main.c:

Код:

#include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include "terminal.h" int main() { int exit_code = 0; openLog(); startTermios(); getTermiosSettings(); printf("Start working.\n"); returnTermiosSettings(); printf("The End\n"); exit( exit_code ); }
terminal.c:

Код:

#include <termios.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> FILE *logfile; static FILE *current_tty; static struct termios default_termios_settings; int openLog ( void ) { logfile = fopen( "counter.log", "w" ); if ( ! logfile ) { fprintf( logfile, "Shit happens: Unable to open logfile\n"); return 0; } else return 1; } int startTermios( void ) { current_tty = fopen( "/dev/tty", "w" ); if ( ! current_tty ) { fprintf( logfile, "Shit happens: Can't open TTY\n"); return 0; } if ( tcgetattr( fileno(current_tty), &default_termios_settings) != 0 ) fprintf( logfile, "Shit happens: tcgetattr() return TRUE\n"); /* return 1; */ else fprintf( logfile, "Shit happens: tcgetattr() return FALSE\n"); /* return 0; */ return 1; } int getTermiosSettings( void ) { struct termios changed_termios_settings; changed_termios_settings = default_termios_settings; changed_termios_settings.c_lflag &= ~ICANON; changed_termios_settings.c_lflag &= ~ISIG; changed_termios_settings.c_lflag &= ~ECHO; changed_termios_settings.c_cc[VMIN] = 1; changed_termios_settings.c_cc[VTIME] = 0; if ( tcsetattr( fileno(current_tty), TCSANOW, &changed_termios_settings )) { fprintf( logfile, "Shit happens: Could not set attributes for terminal with getTermiosSettings()\n" ); tcsetattr( fileno(current_tty), TCSANOW, &default_termios_settings ); return 0; } else fprintf( logfile, "Shit happens 2: Could not set attributes for terminal with getTermiosSettings()\n" ); /* return 1; */ } int returnTermiosSettings( void ) { if ( tcsetattr( fileno(current_tty), TCSANOW, &default_termios_settings )) { fprintf( logfile, "Shit happens: Can't return terminal default settings.\n"); return 0; } else return 1; }
terminal.h:

Код:

extern FILE *logfile; int openLog ( void ); int startTermios(void); int getTermiosSettings(void); int returnTermiosSettings(void);
Содержимое файла counter.log:

Код:

Shit happens: tcgetattr() return FALSE Shit happens 2: Could not set attributes for terminal with getTermiosSettings()

Если кто-нибудь понял, где я ошибься, буду очень признателен за помощь.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение shotdownsystem »

Yaros писал(а):
13.01.2011 12:05
По идее, терминал должен настраиваться так, чтобы фразы "Start working" не было видно, однако этого не происходит.

не понял? почему он не должен выводить, если ему пишут write ?
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение Yaros »

shotdownsystem писал(а):
13.01.2011 12:58
Yaros писал(а):
13.01.2011 12:05
По идее, терминал должен настраиваться так, чтобы фразы "Start working" не было видно, однако этого не происходит.

не понял? почему он не должен выводить, если ему пишут write ?

Установка режима терминала - не отображать выводимое. Как при вводе пароля, например.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение shotdownsystem »

Yaros писал(а):
13.01.2011 13:11
Установка режима терминала - не отображать выводимое. Как при вводе пароля, например.

ну что из stdin он не отображает, вероятно. А почему от write отображать не должен?

write это вывод
puts ("Working, please wait...");while(1);
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение Lan4 »

Yaros писал(а):
13.01.2011 13:11
Установка режима терминала - не отображать выводимое. Как при вводе пароля, например.

ну при вводе пароля не отображается то, что вводится с клавиатуры, а в данном примере наоборот.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение eddy »

shotdownsystem писал(а):
13.01.2011 13:15
ну что из stdin он не отображает, вероятно. А почему от write отображать не должен?

++
Здесь надо было перенаправить вывод хотя бы в /dev/null (fd=open("/dev/null", ...); close(stdout); dup(fd); - как-то так)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: [РЕШЕНО]Не работает программа с использованием termios.

Сообщение Yaros »

Всем спасибо, дело было действительно в том, что флаг ECHO влияет только на ввод.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали: