Открытие, какой процесс был уничтожен Linux уничтожитель OOM

Функция read предназначена главным образом для чтения двоичных данных, а не строк. Таким образом, он читает только те символы, которые вы вводите (то есть последовательность символов, за которой следует символ новой строки), без добавления нулевого завершающего байта. В результате у вас нет правильно отформатированной строки, поэтому с помощью strftime можно прочитать после того, что было записано в байты, которые не были инициализированы и, возможно, после конца массива. Это вызывает неопределенное поведение .

«Правильная версия», кажется, работает, потому что вам повезло. Это один из способов, которым может проявиться неопределенное поведение. Другие люди могли видеть противоположные результаты того, что вы видите.

Вам необходимо записать, сколько байтов было прочитано, и вручную добавить завершающий нулевой байт в массив:

int rval;

if ((rval=read(STDIN_FILENO, format, 49)) < 0)
    fatalError("read() error");

 format[rval] = 0;

155
задан eggyal 21 January 2013 в 14:02
поделиться