linux 32位平台,文件大小受限于2G的解决方法

公司的asterisk系统已经发生了两次crash,检查日志,都是在日志文件写满到2G后自动执行转储时,日志还在写继续写入而导致的。google以后,发现了下面这边文章,赞!
解决了文件大小限于2G的问题,转帖到自己的空间保留。

突破Linux上面ftell函数2GB的文件大小限制
http://www.demix.cn/h?z=28507
在 32 位元的 Linux 上面写超过 2GB 的档案会发生错误,甚至导致程式终止执行。
这是因为 Linux 的系统内部处理档案时用的指标定义为 long,而 long 在 32 位元的系统上的大小为 32 位元,因此最大只能支援 2^31-1 = 2,147,483,647 bytes 等於是 2GB 扣掉 1 byte 的档案大小
64 位元的系统 (例如 AMD64 或 IA64) 则因为 long 定义成 64 位元,所以不会有问题..
# if __WORDSIZE == 64
typedef long int int64_t;
# endif
不过在 FreeBSD 上面,即使是 32 位元的系统,也不会有 2GB 档案大小的限制,这是因为 FreeBSD 内部处理档案时,本来就是使用 64 位元的数字当作指标,所以不会有问题
因此在 32 位元的 Linux 上面,程式需要作一些额外处理才能正确写超过 2GB 的档案
我们先写一个小程式来测试一下 (large.c)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
void sig_xfsz(int sig)
{
printf("ERROR: SIGXFSZ (%d) signal received!\n", sig);
}
int main()
{
int i, fd;
char dummy[4096];

signal( SIGXFSZ, sig_xfsz );

unlink("large.log");
fd = open("large.log", O_CREAT|O_WRONLY, 0644 );

bzero( dummy, 4096 );
/* 2GB = 4KB x 524288 */
for( i = 0 ; i < 524287 ; i++ )
write( fd, dummy, 4096 );
write( fd, dummy, 4095 );
printf("large.log: 2147483647 bytes\n");

if( write( fd, dummy, 1 ) < 0 )
printf("ERROR: %s [errno:%d]\n",strerror(errno),errno);
else
printf("large.log: 2147483648 bytes\n");

close(fd);
exit(0);
}
在 32 位元的 Linux 下面,以上程式编译后若没有特殊处理,执行结果如下:
# gcc -o large32 large.c
# ./large32
large.log: 2147483647 bytes
ERROR: SIGXFSZ (25) signal received!
ERROR: File too large [errno:27]
在写第 2147483648 byte 的时候,程式会收到 signal SIGXFSZ,同时 write() 会回传 -1 错误,errno 则为 27 (File too large)。更甚者,如果程式没有像上面一样去处理 SIGXFSZ 的话,内定的 signal handler 甚至会造成程式停止执行并产生 core dump
接下来,我们在编译同一个程式的时候加入 -D_FILE_OFFSET_BITS=64 再试看看:
# gcc -D_FILE_OFFSET_BITS=64 -o large64 large.c
# ./large64
large.log: 2147483647 bytes
large.log: 2147483648 bytes
果然顺利突破 2GB 的限制了!
而同样的程式在 32 位元的 FreeBSD 下面,不论有没有加这个定义,跑起来都是正确的
不过处理这些大档案的时候,除了编译程式时的参数不同外,有些函数的使用上也要作一些调整,例如 fseek() 与 ftell() 这两个原本使用到 long integer 当作 offset 的函数:
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
只要系统是 32 位元,即使是在 FreeBSD 下面,都需要改为使用 off_t 的版本:
int fseeko(FILE *stream, off_t offset, int whence);
off_t ftello(FILE *stream);
在 Linux 下面,如果 _FILE_OFFSET_BITS 定义为 64,则 off_t 这个型态会自动转成 64 位元的大小(在 FreeBSD 上面,off_t 本来就是 64 位元的大小)
每种系统支援大於 2GB 的档案读写所需要的编译选项都会有一些差异,即使是同样是 Linux 也会因为 32 位元或 64 位元而有不同。有一个简单的方法可以判断,就是利用 glibc 提供的 getconf 来取得编译(compile)以及连结(linking)时所需的参数:
# getconf LFS_CFLAGS
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
# getconf LFS_LDFLAGS 

#
上面是在 32 位元的 Redhat Linux 上面跑出来的结果,代表的是在这个系统上,若要让程式支援 2GB 的档案读写,编译(compile)时需要加上 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 这两个参数,连结(linking)时则不用加任何参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【noip模拟赛4】Matrix67的派对 暴力dfs

【noip模拟赛4】Matrix67的派对描述 Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<N<10)个人参加&#xff0c;Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是&#xff0c;圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多…

Backtrader多周期回测

获取数据 result pd.read_csv(11.csv) df pd.DataFrame(dataresult) df df.set_index([datetime]) df 策略 class MultiTFStrategy(bt.Strategy):params ((period, 20),)# states definationEmpty, M15Hold, H1Hold, D1Hold range(4)States [Empty, M15Hold, H1Hold, D…

CentOS 7 防火墙操作

导语 今天说下防火墙的操作。CentOS 6 的防火墙是 iptables&#xff0c;CentOS 7 默认的是 firewall&#xff0c;以前的操作不再适用。 查看、开启 服务器刚刚重启完毕&#xff0c;先来看下防火墙的状态&#xff0c;输入 systemctl status firewalld 进行查看 这里是关闭的&…

Centos安装nmon软件 ( 测试 )

安装 mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz tar zxvf nmon_linux_14i.tar.gz chmod 777 nmon_x86_64_sles11 12345 启动 ./nmon_x86_64_sles11 1 说明&#xff1a; 按C显示CPU信息&#xff0c;再按…

阿里云安装Quantaxis

参考博客&#xff1a;https://github.com/QUANTAXIS/QUANTAXIS/issues/1395 之后进入阿里云中的Ubuntu界面 输入&#xff1a; sudo yum install apt-transport-https ca-certificates curl software-properties-common Sudo yum install curl service network restartcd qua…

sorted_一个函数秒杀冒泡排序算法和选择排序

sorted一招杀a [3,9,12,4,5,7,8,110]print(sorted(a,reverseTrue))# true为降序print(sorted(a,reverseFalse))# revers false为升序print(sorted(a))#默认是false升序排列Bubble_sort下面看看坑死人无数的冒泡排序内循环和外循环每次循环依次比较大小并来回挪坑,直到把目标值…

转载给ffmpeg入门级:我的第一个调用FFmpeg库的程序出炉

好消息&#xff0c;写了第一个使用了ffmpeg的库的小程序。看起来就是这么简单的一个消息&#xff0c;但是you have no idea how much work that I did before it works...废话少说&#xff0c;总结记录之。。。一、安装好Linux的虚拟机。我用的是FEDORA-16&#xff0c;当然别的…

runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁

容器的安全性一直是容器技术的一个短板。关于容器最大的安全隐患是攻击者可以使用恶意程序感染容器&#xff0c;更严重时可以攻击主机系统。 2月11日&#xff0c;安全研究员Adam Iwaniuk和BorysPopławski发现了容器运行时runC的一个安全漏洞&#xff0c;这个漏洞可以让上述情况…

pandas操作sql数据库

导包 import pymssql from sqlalchemy import create_engine import pandas as pd 连接数据库 #读数据 conn pymssql.connect(server.,user sa,password test,databasepos) sql select * from stock_data df0 pd.read_sql(sql,conn) 写入数据 df pd.read_csv(option_…

MongoDB Mobile Sync for iOS推出Beta版本

2019年2月11日&#xff0c;MongoDB官方博客发文称MongoDB Mobile Sync for iOS的Beta版本即将推出。MongoDB Mobile支持使用单一查询语言进行本地和远程数据访问&#xff0c;包含两个核心部分&#xff1a; MongoDB数据库的移动优化版本&#xff0c;运行在本地设备上&#xff0c…

gdb好文章:GDB十分钟教程

&#xff08;GUI调试器&#xff1a;insight和ddd&#xff09; list(l) &#xff1a;其作用就是列出程序的源代码&#xff0c;默认每次显示10行。 list 行号&#xff1a;将显示当前文件以“行号”为中心的前后10行代码&#xff0c;如&#xff1a;list 12 list 行号1,行号2: 将…

机器学习预测+akshare

import pandas as pd import akshare as ak import numpy as np import talib from datetime import datetime, timedelta import time 获取股票数据 from_date 2010-01-01 from_date datetime.strptime(from_date,"%Y-%m-%d") day_nums 1 current_dt time.st…

[python作业AI毕业设计博客]比Selenium IDE更好用的录制工具: Katalon Recorder

Selenium IDE(集成开发环境 Integrated Development Environment)是用于构建测试脚本的原型工具。 它是一个Firefox插件&#xff0c;提供了易于使用的界面&#xff0c;用于开发自动化测试。 但是最新的Selenium IDE总是弹出一系列如下的对话框&#xff0c;不能直接录制&#xf…

CentOS 7 : Docker私有仓库搭建和使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 系统环境&#xff1a; CentOS 7.2 192.168.0.179&#xff1a;docker仓库 192.168.0.60&#xff1a;客户端 安装并启动docker yum -y…

价值投资/指标选股(akshare)

利用akshare的数据源&#xff0c;可以获取所有的股票数据以及公开的财务数据&#xff0c;可以进行条件筛选&#xff0c;获取满足条件的股票。 这套模板可以用于价值投资&#xff0c;指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak #…

gdb常用命令

[rootredhat home]#gdb 调试文件&#xff1a;启动gdb (gdb) l &#xff1a;&#xff08;字母l&#xff09;从第一行开始列出源码 (gdb) break n :在第n行处设置断点 (gdb) break func&#xff1a;在函数func()的入口处设置断点 (gdb) info break&#xff1a; 查看断点信息 (gdb…

有前途的人工智能大数据分析相关职业:Python数据科学入门之路

2019独角兽企业重金招聘Python工程师标准>>> 为什么学习Python数据科学&#xff1f; Python是数据科学职业所需的宝贵技能之一。Python是数据科学的首选编程语言。 2016年&#xff0c;它超越了R on Kaggle&#xff0c;这是数据科学竞赛的首选平台。2017年&#xff0…

遍历Map key-value的两种方法、遍历Set方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一种遍历方法 : 先获取Map中的所有key值&#xff0c;然后根据key&#xff0c;依次从Map中去数据 Map<String,String> test…

STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器

STL标准容器类简介 标准容器类说明顺序性容器vector从后面快速的插入与删除&#xff0c;直接访问任何元素deque从前面或后面快速的插入与删除&#xff0c;直接访问任何元素list双链表&#xff0c;从任何地方快速插入与删除关联容器set快速查找&#xff0c;不允许重复值multise…

用友云开发者中心助你上云系列之在线调试

现在&#xff0c;大家开始越来越多的谈论到高可用架构的互联网应用。什么是高可用&#xff1f;高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。当我们谈论…