zoukankan      html  css  js  c++  java
  • write error:file too large!!!

    这个错误出现在开发板中,文件系统为ext3

    无ulimit

     

    解决方案有2种:

    方案一 :limit

     

     1        #include <sys/time.h>
     2        #include <sys/resource.h>
     3 int modify_limit()
     4 {
     5         struct rlimit limitf;
     6         if (getrlimit(RLIMIT_CORE, &limitf)==0) {
     7                 printf("limitf.rlim_cur=0x%x,limitf.rlim_max =0x%x  \n",limitf.rlim_cur,limitf.rlim_max );
     8                 limitf.rlim_cur=RLIM_INFINITY;
     9                 limitf.rlim_max =RLIM_INFINITY;
    10 
    11                 
    12                 if(setrlimit(RLIMIT_FSIZE,&limitf)!=0){
    13                         /* failed. try raising just to the old max */
    14                         perror("setrlimit error:");
    15                         return -1;
    16                 }
    17                 printf("setrlimit success!!!,\n");
    18                 printf("limitf.rlim_cur=0x%016x,limitf.rlim_max =0x%016x  \n",limitf.rlim_cur,limitf.rlim_max );
    19         }
    20         return 0;
    21 }

     

     

     

     

    方案二:使用O_LARGEFILE参数:

     

     1 {
     2     int n=WRITE_TIME;
     3     char buf[BUF_LEN]={0xFF};
     4     char out_file[256]={0};
     5     int fd=0;
     6     
     7     switch(argc)
     8     {
     9         case 1:
    10             memcpy(&out_file,DEFAULT_OUT_FILE,sizeof(DEFAULT_OUT_FILE));
    11             break;
    12         case 2:
    13             memcpy(&out_file,&argv[1],strlen(&argv[1]));
    14             break;
    15         default:
    16             return -1;
    17     }
    18 
    19     //modify_limit();
    20 
    21     fd=open(out_file,O_WRONLY|O_CREAT|O_LARGEFILE);
    22     if(fd<=0)
    23     {
    24         perror("open error:");
    25         return -1;
    26     }
    27     
    28     while(n--)
    29         if(safe_write(fd,&buf,sizeof(buf)) != sizeof(buf))
    30         {    
    31             perror("wirte error:");
    32             break;
    33         }
    34     fsync(fd);
    35     close(fd);
    36 }

    需要增加声明在include之前:

     

    1 #define _LARGEFILE_SOURCE
    2 #define _LARGEFILE64_SOURCE
    3 #define _FILE_OFFSET_BITS 64

    编译时带参数:

    1 gcc -o test_wirte New0001.c  -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

     

    验证,第一方案 失败,第二方案 成功。

     

     附带完整 测试代码:

     1 #define _LARGEFILE_SOURCE
     2 #define _LARGEFILE64_SOURCE
     3 #define _FILE_OFFSET_BITS 64
     4 
     5 
     6 #include <stdio.h>
     7 #include <fcntl.h>
     8 #include <string.h>
     9 #include <errno.h>
    10 
    11 #include <sys/types.h>
    12 #include <sys/stat.h>
    13 
    14 
    15 #include <sys/time.h>
    16 #include <sys/resource.h>
    17 int modify_limit()
    18 {
    19         struct rlimit limitf;
    20         if (getrlimit(RLIMIT_CORE, &limitf)==0) {
    21                 printf("limitf.rlim_cur=0x%x,limitf.rlim_max =0x%x  \n",limitf.rlim_cur,limitf.rlim_max );
    22                 limitf.rlim_cur=RLIM_INFINITY;
    23                 limitf.rlim_max =RLIM_INFINITY;
    24 
    25                 
    26                 if(setrlimit(RLIMIT_FSIZE,&limitf)!=0){
    27                         /* failed. try raising just to the old max */
    28                         /*
    29                         ............
    30                         */
    31                         perror("setrlimit error:");
    32                         return -1;
    33                 }
    34                 printf("setrlimit success!!!,\n");
    35                 printf("limitf.rlim_cur=0x%016x,limitf.rlim_max =0x%016x  \n",limitf.rlim_cur,limitf.rlim_max );
    36         }
    37         return 0;
    38 }
    39 
    40 ssize_t  safe_write(int fd, const void *buf, size_t count)
    41 {
    42     ssize_t n;
    43 
    44     do {
    45         n = write(fd, buf, count);
    46     } while (n < 0 /*&& errno == EINTR*/);
    47 
    48     return n;
    49 }
    50 #define BUF_LEN 65535
    51 #define WRITE_TIME 102400
    52 #define DEFAULT_OUT_FILE "/mnt/out_file"
    53 
    54 int main(int argc,char *argv[])
    55 {
    56     int n=WRITE_TIME;
    57     char buf[BUF_LEN]={0xFF};
    58     char out_file[256]={0};
    59     int fd=0;
    60     
    61     switch(argc)
    62     {
    63         case 1:
    64             memcpy(&out_file,DEFAULT_OUT_FILE,sizeof(DEFAULT_OUT_FILE));
    65             break;
    66         case 2:
    67             memcpy(&out_file,&argv[1],strlen(&argv[1]));
    68             break;
    69         default:
    70             return -1;
    71     }
    72 
    73     //modify_limit();
    74 
    75     fd=open(out_file,O_WRONLY|O_CREAT|O_LARGEFILE);
    76     if(fd<=0)
    77     {
    78         perror("open error:");
    79         return -1;
    80     }
    81     
    82     while(n--)
    83         if(safe_write(fd,&buf,sizeof(buf)) != sizeof(buf))
    84         {    
    85             perror("wirte error:");
    86             break;
    87         }
    88     fsync(fd);
    89     close(fd);
    90 }

     

     

  • 相关阅读:
    Git之将master合并到自己分支
    React 中的不可变数据 — Immer
    数据治理项目
    每日Excel系列
    Python实战网站开发:Day6编写配置文件
    Python实战网站开发:Day5搭建Web框架
    Python实战网站开发:Day7搭建MVC
    Visual Studio Code调试模式,出现无法打开,文件是目录错误的解决办法
    第1章 Vue.js2.0由浅入深:基本用法
    Python实战网站开发:Day4编写Model
  • 原文地址:https://www.cnblogs.com/jevan/p/2642113.html
Copyright © 2011-2022 走看看