【问题标题】:What does write() write if null terminator is already reached?如果已经达到空终止符, write() 会写什么?
【发布时间】:2014-03-06 04:45:39
【问题描述】:

对于write(fd[1], string, size) - 如果stringsize 短会怎样?

我查看了手册页,但没有明确说明这种情况。我知道对于read,它只会停在那里并读取string 的任何内容,但write 肯定不是这种情况。那么写是做什么的呢?返回值仍然是size,所以它附加了空终止符吗?为什么它不像read那样停止。

【问题讨论】:

    标签: c string nul


    【解决方案1】:

    当您调用write() 时,系统假定您正在将通用数据写入某个文件——它并不关心您是否有一个字符串。以 null 结尾的字符串被视为一堆非零字节,后跟一个零字节 - 系统将继续写入,直到写入 size 字节。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        write(int fildes, const void *buf, size_t nbyte) 不会写入以空字符结尾的字符串。它写入缓冲区的内容。如果缓冲区中有任何空字符,它们也会被写入。

        read(int fildes, void *buf, size_t nbyte) 也不注意空字符。它将多个字节读入给定的缓冲区,最大为 nbyte。它不添加任何空终止字节。

        这些是低级例程,专为读取和写入任意数据而设计。

        【讨论】:

          【解决方案4】:

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

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

          如果您尝试写入的数据多于缓冲区所包含的数据,则可能会或可能不会工作,具体取决于内存的位置。充其量是未定义的行为。在最坏的情况下,您会遇到段错误并且您的程序会崩溃。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-18
            • 2021-09-02
            • 1970-01-01
            相关资源
            最近更新 更多