对于write(fd[1], string, size)
- 如果string
短于size
会发生什么情况?如果已经达到空终止符,write()会写什么?
我抬头看了man page,但没有明确指出这种情况。我知道,对于read
,它会停在那里,然后阅读string
,但write
肯定不是这种情况。那么写什么呢?返回值仍然是size
,所以它附加了空终止符?为什么它不会像read
那样停下来。
对于write(fd[1], string, size)
- 如果string
短于size
会发生什么情况?如果已经达到空终止符,write()会写什么?
我抬头看了man page,但没有明确指出这种情况。我知道,对于read
,它会停在那里,然后阅读string
,但write
肯定不是这种情况。那么写什么呢?返回值仍然是size
,所以它附加了空终止符?为什么它不会像read
那样停下来。
当你调用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字符,并且在某些设备上,只读取当时可用的数据量,可能返回的数据量少于请求的数据量,但它们在原始字节上运行时未将其解释为“字符串”。
如果您尝试写入比缓冲区包含的数据更多的数据,则根据内存位置的不同,它可能会也可能不会。最好的行为是不确定的。最糟糕的是,你会得到一个段错误,你的程序将崩溃。