기본 콘텐츠로 건너뛰기

2G 이상 파일과 signal

리눅스에서 2G 이상 파일 다루기 핵심은 결국 off_t 데이터형 크기에 달려 있다. (C++ std::iostream에서는 streamoff 객체 크기)
#include <iostream>
#include <cstdio>
using namespace std;

int
main(int,char**)
{
    cout << sizeof(off_t) << endl;
    cout << sizeof(streamoff) << endl;
    return 0;
}
위 파일이 off.cpp라면...
$ g++ -o off off.cpp
$ ./off

  1. Linux 2.6 32bit: 4, 8
  2. FreeBSD 32bit: 8, 4
  3. SunOS 5.8 32bit: 4, 4
앞의 수가 4로 나오면 fopen, fclose, fwrite, fread 등의 glibc 파일 함수로 2기가 이상 파일을 다룰 수 없다. (뒤의 수가 4로 나오면 ifstream, ofstream, fstream 객체로 2기가 이상 파일을 다룰 수 없다. 시그널은 발생하지 않는다.) 만약 위를 위반할 경우, SIGXFSZ 시그널이 발생한다. (액션은 OS별로 다르지만 공통으로 프로세스를 죽인다. SunOS는 fwrite, fread를 무시하며 signal을 발생하지 않는다.)

일반적인 파일 처리라면 모르겠지만 서버 로그 등을 제어한다면 컴파일 옵션으로 64bit 크기 off_t 데이터형을 쓰는 것이 바람직하다.

streamoff 타입
(사실 OS와 무관하다. 정확히는 컴파일러와 해당 라이브러리와 관계가 있다고 해야겠다.)
  • Linux 2.6: int64_t
  • FreeBSD 5.2: long
  • SunOS 5.8: ?

댓글

이 블로그의 인기 게시물

Winget 해시 무시하기

가끔씩 Winget 에서 패키지를 다운로드 했을 때, "설치 관리자 해시가 일치하지 않습니다." 오류가 뜰 때가 있다. 보안 이슈가 있지만, 그냥 무시하고 싶을 때, 아래 순서로 무시해준다. 관리자 권한 winget settings --enable InstallerHashOverride 설치 winget install --ignore-security-hash --id NirSoft.NirCmd

Windows 11 기존 컨텍스트 메뉴 사용

Windows 11 에서, 컨텍스트 메뉴가 지저분한게 싫었는지, 모던 컨텍스트 메뉴라고 따로 필요한 것만 정리해서 보여준다. 그러나 이게 좀 불편하고, 기존의 꼭 필요한 메뉴가 보이지 않아 굳이 한 번 더 기존 메뉴를 불러오는데, 모든 앱들이 모던 컨텍스트 메뉴로 옮길 때까지는 기존 컨텍스트 메뉴를 기본으로 볼 수 있는 방법이 있다. REM 관리자 권한 REM 기존 컨텍스트 메뉴 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve REM 모던 컨텍스트 메뉴로 되돌리기 reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f 이거 하고 탐색기를 재시작한다. 참조:  Restore old Right-click Context menu in Windows 11