기본 콘텐츠로 건너뛰기

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: ?

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)