为何write函数向文件描述符写入100字节?缓冲区仅12字节
问题:write函数为何写入了100字节而非预期的12字节?
我编写了如下代码,将buf[12]中的"hello world"复制到foo.txt文件,代码执行成功。但我有一个疑问:buf[12]中仅包含12个字符(包括'\0'终止符),write函数难道不应该只向文件写入12字节吗?为何实际写入了100字节?(我原本以为write函数最多只会写入MAXLINE字节)。
代码示例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #define MAXLINE 100 int main() { char buf[12] = "hello world"; int fd, writtenbytes; fd=open("foo.txt", O_RDWR, 0); if(fd == -1) { perror("Error opening file"); exit(1); } if ((writtenbytes = write(fd, buf, MAXLINE)) < 0 ) { perror("writing"); } printf("writtenbytes: %d\n", writtenbytes); }
执行输出
writtenbytes: 100
问题解答
- 核心原因:
write是底层系统调用,它完全按照你传入的第三个参数(要写入的字节数)读取内存数据,既不会识别字符串的'\0'终止符,也不会检查缓冲区的实际大小。你这里传了MAXLINE=100,所以它会尝试从buf的起始位置读取100字节写入文件。 - 为何写入100字节:
buf只有12字节,剩下的88字节是栈上的未初始化随机内存数据,write会把这些随机内容一并写入文件,最终总共写入100字节。 - 正确写法:如果要写入
buf中的有效字符串(包含'\0'),第三个参数应该用strlen(buf)+1;如果不需要写入终止符,用strlen(buf)即可;也可以直接写固定值12。 - 额外注意:原代码中
open函数如果目标文件不存在会打开失败,建议加上O_CREAT标志并指定文件权限,比如open("foo.txt", O_RDWR | O_CREAT, 0644)。
内容的提问来源于stack exchange,提问作者Mory
相关产品推荐
相关产品推荐

