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.pswp.cn/news/449491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449491.shtml
英文地址,請注明出處:http://en.pswp.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;通過設計減少系統不能提供服務的時間。當我們談論…