[英]What does write() write if null terminator is already reached?
對於write(fd[1], string, size)
- 如果string
短於size
會發生什么?
我查看了手冊頁,但沒有明確說明這種情況。 我知道,對於read
,它只是停在那里並讀取任何string
,但它肯定不是write
的情況。 那么寫什么呢? 返回值仍然是size
所以它是否附加空終止符? 為什么它不像read
那樣停止。
當您調用write()
,系統會假定您正在將通用數據寫入某個文件 - 它並不關心您是否有字符串。 一個以null結尾的字符串被視為一堆非零字節,后跟一個零字節 - 系統將一直寫出,直到寫入size
字節為止。
因此,指定比字符串長的size
可能是危險的。 系統可能正在讀取超出文件字符串末尾的數據,可能是垃圾數據。
write
將從string
開始寫入size
字節的數據。 如果將字符串定義為比大小短的數組,則它將具有未定義的行為。 但在你之前的問題中, 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字符,並且在某些設備上,只讀取當時可用的數據量,可能返回的數據少於請求的數據,但是它們在原始字節上操作而不將它們解釋為“字符串”。
如果您嘗試寫入的數據多於緩沖區所包含的數據,則根據內存的位置,它可能會也可能不起作用。 最好的行為是未定義的。 在最壞的情況下,你會遇到一個段錯誤,你的程序會崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.