2014-03-06 30 views
2

对于write(fd[1], string, size) - 如果string短于size会发生什么情况?如果已经达到空终止符,write()会写什么?

我抬头看了man page,但没有明确指出这种情况。我知道,对于read,它会停在那里,然后阅读string,但write肯定不是这种情况。那么写什么呢?返回值仍然是size,所以它附加了空终止符?为什么它不会像read那样停下来。

回答

4

当你调用write(),系统假定你正在编写通用的数据在一定文件中的值写入 - 它并不关心你有一个字符串。一个以空字符结尾的字符串被视为一串非零字节,后跟一个零字节 - 系统将继续写出,直到它被写入size字节。

因此,指定size比您的字符串更长可能是危险的。很可能系统正在读取超出文件尾部的数据,可能会填充垃圾数据。

2

write将写入size字节的数据从string开始。如果将字符串定义为比大小更短的数组,则它将具有未定义的行为。但在你之前的问题中,char *line = "apple";包含6个字符(即a,p,p,l,e和空字符)。

所以最好用的size设置为正确的值

0

write调用输出给定大小的缓冲区。它不会试图解释缓冲区中的数据。也就是说,你给它一个指向内存位置的指针和一些要写入的字节(长度),只要这些内存位置存在于程序数据的合法部分中,它就会将这些字节复制到输出文件中描述。

与字符串操作例程写入和读取的情况不同,忽略空字节,即零值字节。 read确实关注EOF字符,并且在某些设备上,只读取当时可用的数据量,可能返回的数据量少于请求的数据量,但它们在原始字节上运行时未将其解释为“字符串”。

如果您尝试写入比缓冲区包含的数据更多的数据,则根据内存位置的不同,它可能会也可能不会。最好的行为是不确定的。最糟糕的是,你会得到一个段错误,你的程序将崩溃。

相关问题