Что пишет write (), если нулевой Терминатор уже достигнут?



Для write(fd[1], string, size) - что произойдет, если string короче size?



Я заглянул на главную страницу, но там четко не указано, что это за ситуация. Я знаю, что для read он просто остановился бы и прочитал все, что есть string, но это, конечно, не так для write. Так что пишите делаешь? Возвращаемое значение по-прежнему size, так это добавление нулевого Терминатора? Почему бы ему просто не остановиться, как read.

478   4  

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

    Ничего не найдено.