Что пишет write (), если нулевой Терминатор уже достигнут?
Для write(fd[1], string, size) - что произойдет, если string короче size?
Я заглянул на главную страницу, но там четко не указано, что это за ситуация. Я знаю, что для read он просто остановился бы и прочитал все, что есть string, но это, конечно, не так для write. Так что пишите делаешь? Возвращаемое значение по-прежнему size, так это добавление нулевого Терминатора? Почему бы ему просто не остановиться, как read.
4 ответов:
Когда вы вызываете
write(), система предполагает, что вы записываете общие данные в какой - то файл-ей все равно, что у вас есть строка. Строка с нулевым окончанием рассматривается как набор ненулевых байтов, за которыми следует нулевой байт-система будет продолжать записывать, пока не будет записаноsizeбайт.Таким образом, указание
size, которое длиннее вашей строки, может быть опасным. Вполне вероятно, что система считывает данные за пределами конца строки из вашего файла, вероятно, заполненного мусором данные.
writeзапишетsizeбайт данных, начиная сstring. Если вы определяете строку как массив короче размера, он будет иметь неопределенное поведение. Но в предыдущем вопросеchar *line = "apple";содержит 6 символов (то есть a, p, p, l, e и нулевой символ).Поэтому лучше всего написать со значением
size, установленным в правильное значение
Write (int fildes, const void *buf, size_t nbyte) не записывает строки с нулевым завершением. Он записывает содержимое буфера. Если в буфере есть какие-либо пустые символы, они также будут записаны.
Read (int fildes, void * buf, size_t nbyte) также не обращает внимания на пустые символы. Он считывает некоторое количество байт в заданный буфер, максимум до nbyte. Он не добавляет никаких нулевых завершающих байтов.
Это низкоуровневые процедуры, предназначенные для чтение и запись произвольных данных.
Вызов
writeвыводит буфер заданного размера. Он не пытается интерпретировать данные в буфере. То есть вы даете ему указатель на место в памяти и количество байтов для записи (длина), а затем, пока эти места памяти существуют в законной части данных вашей программы, он будет копировать эти байты в выходной файловый дескриптор.В отличие от процедур обработки строк, которые пишут и читают, игнорируют нулевые байты, то есть байты с нулевым значением.
readдействительно обращает внимание на символ EOF и на некоторых устройствах будет считывать только тот объем данных, который доступен в данный момент, возможно, возвращая меньше данных, чем требуется, но они работают с необработанными байтами, не интерпретируя их как "строки".Если вы попытаетесь записать больше данных, чем содержит буфер, он может работать или не работать в зависимости от положения памяти. В лучшем случае поведение не определено. В худшем случае вы получите ошибку сегмента, и ваша программа рухнет.
Comments