기본 콘텐츠로 건너뛰기

리눅스에서 2G 이상 파일 다루기

리눅스 커널 2.4부터 2기가 파일제한이 풀렸다.

커널만 지원한다고 다 해결될 일이 아니다. 표준함수를 쓴다면 표준 라이브러리(glibc에 뭉쳐 있겠지?)가 지원해야한다. 다행히 표준 라이브러리는 2기가 이상 파일(large file이라고 한다)을 지원한다.

단, 다른 이름으로 제공한다. 예를 들어 fopen이 있으면 fopen64가 따로 있다. off_t 역시 off64_t가 따로 존재한다. 또한 이 라이브러리를 사용하고 싶다면 _LARGEFILE_SOURCE를 정의해야한다. 즉 컴파일 옵션에 -D_LARGEFILE_SOURCE를 포함해야한다.

ㅡ_-); 불편하다. 그냥 fopen == fopen64 이렇게 쓸 수 없나? 소스 안 고쳐도 되고 말이야.

그래서 _FILE_OFFSET_BITS가 있다. 컴파일 옵션에 -D_FILE_OFFSET_BITS=64를 하면 모든 *64 함수/변수형은 기존 이름으로 바뀐다. 즉 소스에 fopen이라고 쓰더라도 fopen64를 호출한다.

ㅡ_-); 결국 2기가 이상 파일을 쓰려면 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64를 옵션으로 써야한다. (테스트해보니 _FILE_OFFSET_BITS만 64로 정의했어도 잘 돌아간다.)

테스트 코드 (offset.c)
#include <stdio.h>
#include <unistd.h>

int
main(int,char**)
{
        printf("fopen: %p\n", fopen);
        printf("fopen64: %p\n", fopen64);
        printf("size of off_t: %d\n", sizeof(off_t));
        return 0;
}

컴파일 결과
32bit CPU
$ gcc -o offset offset.c
$ ./offset
fopen: 0x80483dc
fopen64: 0x80483cc
size of off_t: 4
(fopen과 fopen64의 함수 주소 값이 다르다)

$ gcc -o offset offset.c -D_FILE_OFFSET_BITS=64
$ ./offset
fopen: 0x80483a8
fopen64: 0x80483a8
size of off_t: 8
(fopen과 fopen64의 함수 주소 값이 같다)

64bit CPU (x86_64)
$ gcc -o offset offset.c
$ ./offset
fopen: 0x4004f0
fopen64: 0x400510
size of off_t: 8
(fopen과 fopen64의 함수 주소 값이 다르다)

$ gcc -o offset offset.c -D_FILE_OFFSET_BITS=64
$ ./offset
fopen: 0x4004c0
fopen64: 0x4004c0
size of off_t: 8
(fopen과 fopen64의 함수 주소 값이 같다)


Fedora Core 6에서 x86_64(64bit cpu) 깔아서 해봤더니 옵션 없을 때 off_t 크기가 8로 나오더군. 그러나 fopen과 fopen64 주소값이 다른 걸로 보아, 될 수 있으면 _FILE_OFFSET_BITS를 세팅해주는 센스를 발휘하는게 좋을 듯 싶다.

댓글

이 블로그의 인기 게시물

버즈 라이브 배터리 교체

나는 버즈 라이브(SM-R180)가 좋은데, 평가가 별루였는지, 해당 스타일로 버즈를 더 이상 만들지 않고 있다. 아무튼, 오래 쓴 버즈 라이브 배터리가 슬슬 맛이 가기 시작해서, 블로그 를 참조하면서 분해 및 교체를 하였다. (진짜 쉬움) 요로코롬 위아래를 살짝 눌러주면 뚜껑이 벌어진다. 안쪽 플라스틱은 오른쪽은 분홍색, 왼쪽은 회색이다. 리본 케이블 살짝 들어내고, 기판을 떼어내면, 작은 나사가 있다. 나사를 풀고, 플라스틱을 걷어내면, 검은 양면 테이프로 고정된 CR1254 배터리가 보인다. 잘 쑤셔서(?) 꺼낸다. 새로운 CR1254 배터리를 넣는다. 음극이 아래로 가도록 하고, 분해의 역순으로 조립하면 된다. 조립할 때, 아까 풀었던 나사는 잊지 말고 꼭 조여준다. (까먹고 조립해서 다시 뜯고 조립함) 충전도 잘 되고, 소리도 잘 나는거 보면, 조립도 잘 된 것 같다. 이렇게 버즈 라이브의 수명을 강제로 늘렸다. 나중에 본체 배터리도 갈아야겠다.

Windows 에서 절전을 깨우는 장치 찾기

참조:  https://www.reddit.com/r/computer/comments/wquswv/windows_11_pc_wakes_up_every_time_i_move_usb/ powercfg /devicequery wake_armed powercfg /deviceenablewake "[DEVICE]" # $PROFILE function Get-WakeArmedDevices { $devices = powercfg -devicequery wake_armed if ($devices) { $devices | ForEach-Object { $_.Trim() } } else { Write-Host "No devices are currently armed for wake events." } } function Set-EnableWakeOnDevice { param( [string]$deviceName ) sudo powercfg -deviceenablewake $deviceName } function Set-DisableWakeOnDevice { param( [string]$deviceName ) sudo powercfg -devicedisablewake $deviceName }