Функция read
предназначена главным образом для чтения двоичных данных, а не строк. Таким образом, он читает только те символы, которые вы вводите (то есть последовательность символов, за которой следует символ новой строки), без добавления нулевого завершающего байта. В результате у вас нет правильно отформатированной строки, поэтому с помощью strftime
можно прочитать после того, что было записано в байты, которые не были инициализированы и, возможно, после конца массива. Это вызывает неопределенное поведение .
«Правильная версия», кажется, работает, потому что вам повезло. Это один из способов, которым может проявиться неопределенное поведение. Другие люди могли видеть противоположные результаты того, что вы видите.
Вам необходимо записать, сколько байтов было прочитано, и вручную добавить завершающий нулевой байт в массив:
int rval;
if ((rval=read(STDIN_FILENO, format, 49)) < 0)
fatalError("read() error");
format[rval] = 0;
Испытайте это:
grep -i 'killed process' /var/log/messages