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


Спасибо.

-
Re: Carriage Return
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.05.26 12:42
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

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


Вообще-то это совсем не то, как надо делать. Надо писать лог.
Можно через syslog(), можно через свой файл. Можно в сокет, из которого будут читать желающие. Можно комбинировать эти подходы.
/dev/console это, конечно, финальное назначение как минимум части логов, но в остальном это место, предназначенное только для самых-самых системных компонентов вроде бутлоадера, ядра и init.

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


Про это уже сказали — дисциплина терминала (man termios), текущее состояние опции ONLCR.

Но повторю про диверсионность подхода в целом.
The God is real, unless declared integer.
Re[2]: Carriage Return
От: Лазар Бешкенадзе СССР  
Дата: 08.05.26 08:06
Оценка:
Здравствуйте, netch80, Вы писали:

N>Вообще-то это совсем не то, как надо делать. Надо писать лог.

N>Можно через syslog(), можно через свой файл. Можно в сокет, из которого будут читать желающие. Можно комбинировать эти подходы.
N>/dev/console это, конечно, финальное назначение как минимум части логов, но в остальном это место, предназначенное только для самых-самых системных компонентов вроде бутлоадера, ядра и init.

В вспомогательном сервисе блокировок я пишу syslog. Сейчас это выглядит так:

system(acommand);
syslog(LOG_SECURITY | LOG_NOTICE, "%s\n", acommand);


В хвосте /var/log/security сейчас можно прочитать:

May  5 02:13:23 s17 block.exe[4157]: ipfw table BT0 add 185.177.72.16 0
May  5 02:18:27 s17 block.exe[4157]: ipfw table BT0 add 185.177.72.30 0
May  5 02:23:33 s17 block.exe[4157]: ipfw table BT0 delete 185.177.72.16
May  5 02:28:32 s17 block.exe[4157]: ipfw table BT0 delete 185.177.72.30
May  6 13:53:34 s17 block.exe[3679]: ipfw table BT0 add 142.93.176.115 0
May  6 14:03:43 s17 block.exe[3679]: ipfw table BT0 delete 142.93.176.115
May  6 15:02:25 s17 block.exe[3679]: ipfw table BT0 add 192.253.248.169 0
May  6 15:12:37 s17 block.exe[3679]: ipfw table BT0 delete 192.253.248.169
May  8 05:11:38 s17 block.exe[3679]: ipfw table BT0 add 64.227.1.41 0
May  8 05:21:42 s17 block.exe[3679]: ipfw table BT0 delete 64.227.1.41


В основном сервисе тоже есть события которые я намерен писать в log. Но есть туча других событий. У меня в зависимости от установки параметра verbosity выводятся сообщения о критических ошибках после которых идет abort, о некритических ошибках типа ошибок сетевой передачи, об ошибках протокола HTTP (400, 403, 404, 413, 414, 418, 444, 503), сообщения об успешно выполненных запросах (200, 304), сообщения об установлении соединений и о их закрытии, и просто информационные сообщения типа "Service is starting." Всему этому в log делать нечего. Все это мне нужно во время отладки а в реальной жизни будет -v0 когда в консоль будет выводится сообщение о критической ошибке перед вызовом abort и я рассчитываю но то что такое никогда не произойдет. Скорее все-таки -v1 но не выше.

-
Re[3]: Carriage Return
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 08.05.26 17:55
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

ЛБ>В основном сервисе тоже есть события которые я намерен писать в log. Но есть туча других событий. У меня в зависимости от установки параметра verbosity выводятся сообщения о критических ошибках после которых идет abort, о некритических ошибках типа ошибок сетевой передачи, об ошибках протокола HTTP (400, 403, 404, 413, 414, 418, 444, 503), сообщения об успешно выполненных запросах (200, 304), сообщения об установлении соединений и о их закрытии, и просто информационные сообщения типа "Service is starting." Всему этому в log делать нечего.


С чего бы это? В syslog() можно выставлять уровни, в syslogd можно разделять выходные файлы по уровням. Это я не вспоминаю, что ещё есть фильтрации по категориям и по имени сервиса.
Ну и свои фильтрации перед ним же можете добавлять.

Вопрос не в том, что именно отправлять, а в том, что прямая запись в console это грубый вредный хак.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.