为什么写文件一次只能写8192个byte?

duchenhi 2011-07-22 09:17:48

fd = open("/home/duchen/dada", O_RDWR|O_TRUNC);
ssize_t wr_size;
wr_size = write(fd, "faehe", 10000);
printf("wr_size is %d\n", wr_size);

结果显示:wr_size is 8192

是不是和磁盘是块设备有关?能够调节这个数字?
...全文
521 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheidtf 2011-07-26
  • 打赏
  • 举报
回复
这个取决于硬盘的扇区大小是512byte/sec.
8192/512 = 16,表明写入了16扇区。
write 在底层是调用scsi write (10)来写入数据的。
这个可能协议有关,系统做了优化。

所以你在写入数据的时候最好是512字节的倍数。
challenge99 2011-07-26
  • 打赏
  • 举报
回复
wr_size = write(fd, "faehe", 10000);

这个指针不越界访问了么

write 有可能被信号中断,请检查errno
squiffy 2011-07-24
  • 打赏
  • 举报
回复
struct stat结构中有个变量:st_blksize指明了最优块大小,你可以确认一下是不是8192

fstat(fd, &stat)可以获得


我也很奇怪,为什么不返回10000.

是不是因为"faehe"是个数据段地址,读出错了,所以写了一块就退出了?
justkk 2011-07-23
  • 打赏
  • 举报
回复
关注一下
也许底层每次写入8192,但是write返回时应该完成所有请求数据的写入啊
沭水河畔 2011-07-23
  • 打赏
  • 举报
回复
[code=c/c++]
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(void)
{
int fd;
int size=0,i=0;
char str1[48]={0};
char str2[16]={0};
char *p=NULL;

strncpy(str1,"Build with gcc 4.3 under Ubuntu 64bit, 2011-7-23",48);
strncpy(str2,"123456789ABCDEF",16); /* 16 bytes */

printf("%p %p\n",str1,str2);
p=(str1>str2?str2:str1);

for(i=0;i<64;i++)
{
printf("%c",*(p+i));
}
printf("\n");
#ifdef WRITEFILE
fd = open("data.bak",O_RDWR | O_TRUNC);
size = write(fd,(str1>str2?str2:str1),10000);

printf("%d\n",size);
#endif
return 0;
}
[/code]
樓主可以試試這段代碼。留意棧和堆以及靜態數據區地址增長方向的不同。
沭水河畔 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 justkk 的回复:]

关注一下
也许底层每次写入8192,但是write返回时应该完成所有请求数据的写入啊
[/Quote]
樓主的寫法,系統會以“faehe”為首地址,將其後的8192個字節都寫入文件。樓主可以查看一下文件的內容。留意“fache”之後被寫入了什麽。
沭水河畔 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yq_118 的回复:]

你要有10000个字节让write去写啊。
C/C++ code
char * s = malloc(10000);
wr_size = write(fd, s, 10000);
printf("wr_size is %d\n", wr_size);
[/Quote]
至於爲什麽是8192,這個應該是系統的設定,我在Ubuntu 64為上是2416。
APUE第二版3.9節上比較過,系統調用每次寫入8192,I/O效率是最高的。
stein42 2011-07-22
  • 打赏
  • 举报
回复
你要有10000个字节让write去写啊。
    char * s = malloc(10000);
wr_size = write(fd, s, 10000);
printf("wr_size is %d\n", wr_size);

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧