当前位置:  技术问答>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返回时应该完成所有请求数据的写入啊

|

樓主的寫法,系統會以“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"是个数据段地址,读出错了,所以写了一块就退出了?

|
这个取决于硬盘的扇区大小是512byte/sec.
8192/512 = 16,表明写入了16扇区。
write 在底层是调用scsi write (10)来写入数据的。
这个可能协议有关,系统做了优化。

所以你在写入数据的时候最好是512字节的倍数。

|
wr_size = write(fd, "faehe", 10000);

这个指针不越界访问了么

write 有可能被信号中断,请检查errno

    
 
 

您可能感兴趣的文章:

  • ext2的文件系统,如何修改内核让其文件块加大? (为什么只能给31分?)
  • linux 指定用户只能读写指定的文件夹
  • 为什么不能修改Windows分区上的文件,而只能看?
  • 请教:是不是 linux 所以文件系统一共最大只能占用 4000 空间
  • 用secureCRT 在终端只能看目录下的部分文件,看不到的那部分文件也不是隐藏文件,而在别人的机器上用相同的用户,相同的secureCRT工具都能看得到
  • 请教大家一个问题,有没有一个类既可选择目录又可选文件,jFileChooser只能选文件。
  • 在unix查找某个目录下一小时前的生成的文件,怎么查找?find只能按天来查。
  • linux下文件的修改时间最多只能精确到秒吗?
  • 在LINUX下,进程间访问临界资源只能通过效率很低的锁文件方式来实现吗?
  • RedHat 下查找文件的方法?(不好意思,只能给21pts)
  • 高手,进。。suse linux ftp 后ls只能看到2000个文件,急急急!
  • shell ftp只能发送2个文件
  • linux下ftp所有用户均只能copy文件进去,目录不行。新建目录也不行。请教该如何解决?谢!
  • unix 下 C++实现 ftp 到另一台主机上 修改文件内容 !能不能直接在主机上修改 还是只能get下来本地修改完后 在put上去
  • vm tools 安装后,只能从vm拖文件到主机,无法从拖到虚拟机
  • jsp在客户端只能读取服务器上的文件?100分
  • Linux 内核2.4.21使用mount命令挂载网络磁盘(windows)后,最多只能放2G文件。如何解决(急)
  • 高分相送,用jspsmartupload上传文件,在webshpere3。5环境里面很好用,但是在4。0里面就只能上传不超过7k的东东了,怎么解决这个问题,
  • 关于 VMware共享文件夹,只能拷出,不能拷入,问题??
  • gdb调试elf文件,为什么只能看到c源码,看不到汇编源码???
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 eof():如果处于文件结尾处则返回true
  • Shell脚本如何递归现实一个文件夹中的文件(文件夹中含有文件夹)
  • WinDows8最新版文件夹加密
  • 求命令:什么命令可以把文件夹下所有的文件按修改时间先后排出来,包括子文件夹里的文件。
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • [提问]Linux下如何把多个.a文件编译一个.so文件,或者把多个.so文件编译成一个.so文件
  • python异常信息堆栈输出到日志文件
  • 请问:proc中的头文件中能包含头文件吗?(感觉如果头文件中包含头文件的话,在链接时就会有错误啊)
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 为什么不能修改Windows分区上的文件,而只能看? iis7站长之家
  • 在MyEclipse中设开启xml文件自动提示和自动完成功能
  • vi 中编辑两个文件,怎样从其中一个文件拷一段内容到另一个文件中。(同时打开两个文件)
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 怎么统计一个文件夹下有多少个文件(不包括文件夹)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 请教高手一个简单问题:给定一个文件名,如何去查找该文件正在被几个程序使用,并怎么样才可以切断这个文件与正在打开该文件的程序之间的
  • MyEclipse如何查看和设置文件编码格式相关操作
  • linux 下的 .a 文件 .o 文件 是什么文件?各有什么作用?
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用socket一次传输多个文件,如何确定文件一个文件结束
  • 设置sharepoint 2010文档库中的 pdf文件在浏览器中访问的打开方式
  • 如何删除某个目录下除了指定文件夹之外的所有文件和文件夹


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3