Carriage Return
От: Лазар Бешкенадзе СССР  
Дата: 23.04.26 14:01
Оценка:
Я тут в FreeBSD перевел программку в фоновый режим — daemon — и наблюдаю непонятное явление.

Пока это было просто консольное приложение я выводил на экран функцией printf:

printf("Bla bla bla\n");

Теперь приходится открывать system console — /dev/console — и писать туда.

fCon = fopen("/dev/console", "w");
fprintf(fCon, "Bla bla bla\n");

Этот вывод идет на терминал ttyv0. Если при этом я logged in на этом терминале то все нормально. Но если я даю команду exit, дальше вывод на этот экран идет без возврата каретки, ступеньками.

Я могу, конечно, добавить возврат каретки явно:

fprintf(fCon, "Bla bla bla\r\n");

Но, вроде, везде говорят что в UNIX это не нужно. В чем дело, где об этом можно почитать?

-
Re: Carriage Return
От: kov_serg Россия  
Дата: 23.04.26 14:55
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

ЛБ>fCon = fopen("/dev/console", "w");


Может стоит попробывать "wb" вместо "w"
Re[2]: Carriage Return
От: Лазар Бешкенадзе СССР  
Дата: 23.04.26 15:21
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Может стоит попробывать "wb" вместо "w"


Попробовать, конечно, можно, но хотелось бы понять что происходит.

К тому же:

https://man.freebsd.org/cgi/man.cgi?query=fopen&apropos=0&sektion=3&manpath=FreeBSD+15.0-RELEASE+and+Ports.quarterly&format=html

The mode string can also include the letter "b" after either the "+" or the first letter. This is strictly for compatibility with ISO/IEC 9899:1990 ("ISO C90") and has effect only for fmemopen(); otherwise "b" is ignored.


-
Re: Carriage Return
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.04.26 19:27
Оценка: 5 (1)
Здравствуйте, Лазар Бешкенадзе, Вы писали:

ЛБ>Но, вроде, везде говорят что в UNIX это не нужно.


В дисковых файлах, в UNIX, действительно строки разделяют символом '\n' без '\r'.

Но вот для терминала, как для устройства, символы '\n' и 'r' имеют разный смысл. Первый переходит на следующую строку, второй возвращает курсор к началу строки.

Но дело в том, что между программой, которая пишет на терминал/консоль, отправляя байтики в stdout и самим терминалом/консолью существует еще один компонент, называется line discipline.

И у этого компонента есть своё состояние и свои функции. Например, он может автоматически превращать '\n' в последовательность "\n\r".

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

ЛБ>В чем дело, где об этом можно почитать?


Ну, например, man stty, man termios
Re[2]: Carriage Return
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.04.26 19:27
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Может стоит попробывать "wb" вместо "w"


В UNIX это одно и тоже.
Re[2]: Carriage Return
От: Лазар Бешкенадзе СССР  
Дата: 24.04.26 02:03
Оценка:
Здравствуйте, Pzz, Вы писали:

ЛБ>>В чем дело, где об этом можно почитать?


Pzz>Ну, например, man stty, man termios


Спасибо.

-
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.