2012-04-28 3 views
4

유닉스 파일 버퍼링을 켜고 끄기위한 간단한 C 프로그램을 작성했습니다. 아래의 코드는 그것을 켜는 것입니다. 나는 fcntl을 사용하여 설정을 얻고, O_SYNC 플래그를 설정 한 다음 설정을 다시 커널에 기록합니다. 하지만 다시 설정을 가져 오면 O_SYNC 플래그가 설정되지 않습니다.fcntl : 디스크 버퍼링 켜기 및 끄기

int result, s; 
s = fcntl(*fd, F_GETFL); 
s |= O_SYNC; // set SYNC bit 
result = fcntl(*fd, F_SETFL, s); 

if(result == -1) 
    perror("setting SYNC"); 
else 
{ 
    // Check buffering is on 
    s = fcntl(*fd, F_GETFL); // 
    if((s & O_SYNC) == O_SYNC) // check if SYNC bit is set 
     printf("In function buffering_off(): Buffering is OFF\n"); 
    else 
     printf("In function buffering_off(): Buffering is ON\n"); 
} 

어떤 도움을 주시면 감사하겠습니다. 건배 :) 나는 리눅스 커널의 목록이 토론을 발견

+0

커널 버전도 확인해야합니다. http://milek.blogspot.de/2010/12/linux-osync-and-write-barriers.html에 따르면이 기능은 2.6.31에서만 도입되었습니다. – vissi2

답변

2

: 간단히 말해서 http://choon.net/forum/read.php?21,22539

:

문제는 fcntl(fd, F_SETFL, flags|O_SYNC)가 작동 나타납니다,하지만 자동으로 O_SYNC 플래그를 무시합니다. O_SYNC으로 파일을 열면 문제가 없지만 나중에 fcntl을 통해 설정하면 작동하지 않습니다.

이 버그는 그날부터 있었지만 최근에 수정되었을 수 있습니다. (배송 커널에 관한 한 현재 상태가 확실하지 않습니다.)

약 6 세 버전 SuSE Linux를 사용하고 있습니다.

약 1 년 전의 논의입니다. 커널의 나이를 감안할 때, 버그의 영향을 확실히받습니다.

+0

약 6 년 된 SuSE Linux를 사용하고 있습니다. 어쩌면 UNIX와 달리 Linux OS의 버그 일 수 있습니다. – Kiyomasa

+0

@Kiyomasa :이 토론은 특히 Linux에 관한 내용이며 스레드는 약 1 년 전입니다. 따라서 커널은 버그의 영향을 확실히받습니다. – NPE