当前位置: 技术问答>linux和unix
为什么写文件一次只能写8192个byte?
来源: 互联网 发布时间:2016-12-16
本文导语: fd = open("/home/duchen/dada", O_RDWR|O_TRUNC); ssize_t wr_size; wr_size = write(fd, "faehe", 10000); printf("wr_size is %dn", wr_size); 结果显示:wr_size is 8192 是不是和磁盘是块设备有关?能够调节这个数字? | 你要有100...
fd = open("/home/duchen/dada", O_RDWR|O_TRUNC);
ssize_t wr_size;
wr_size = write(fd, "faehe", 10000);
printf("wr_size is %dn", wr_size);
结果显示:wr_size is 8192
是不是和磁盘是块设备有关?能够调节这个数字?
|
你要有10000个字节让write去写啊。
char * s = malloc(10000);
wr_size = write(fd, s, 10000);
printf("wr_size is %dn", wr_size);
|
至於爲什麽是8192,這個應該是系統的設定,我在Ubuntu 64為上是2416。
APUE第二版3.9節上比較過,系統調用每次寫入8192,I/O效率是最高的。
|
关注一下
也许底层每次写入8192,但是write返回时应该完成所有请求数据的写入啊
也许底层每次写入8192,但是write返回时应该完成所有请求数据的写入啊
|
樓主的寫法,系統會以“faehe”為首地址,將其後的8192個字節都寫入文件。樓主可以查看一下文件的內容。留意“fache”之後被寫入了什麽。
|
#include
#include
#include
#include
#include
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 %pn",str1,str2);
p=(str1>str2?str2:str1);
for(i=0;istr2?str2:str1),10000);
printf("%dn",size);
#endif
return 0;
}
樓主可以試試這段代碼。留意棧和堆以及靜態數據區地址增長方向的不同。
|
struct stat结构中有个变量:st_blksize指明了最优块大小,你可以确认一下是不是8192
fstat(fd, &stat)可以获得
我也很奇怪,为什么不返回10000.
是不是因为"faehe"是个数据段地址,读出错了,所以写了一块就退出了?
fstat(fd, &stat)可以获得
我也很奇怪,为什么不返回10000.
是不是因为"faehe"是个数据段地址,读出错了,所以写了一块就退出了?
|
这个取决于硬盘的扇区大小是512byte/sec.
8192/512 = 16,表明写入了16扇区。
write 在底层是调用scsi write (10)来写入数据的。
这个可能协议有关,系统做了优化。
所以你在写入数据的时候最好是512字节的倍数。
8192/512 = 16,表明写入了16扇区。
write 在底层是调用scsi write (10)来写入数据的。
这个可能协议有关,系统做了优化。
所以你在写入数据的时候最好是512字节的倍数。
|
wr_size = write(fd, "faehe", 10000);
这个指针不越界访问了么
write 有可能被信号中断,请检查errno
这个指针不越界访问了么
write 有可能被信号中断,请检查errno