2012-04-28 108 views
4

我寫了一個簡短的C程序來打開和關閉unix文件緩衝。下面的代碼是打開它。我使用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 2012-04-28 10:28:23

回答

2

我發現這個討論Linux內核列表:http://choon.net/forum/read.php?21,22539

一言以蔽之:

的問題是,fcntl(fd, F_SETFL, flags|O_SYNC)似乎工作,只是默默地忽略O_SYNC標誌。 使用O_SYNC打開文件可以,但稍後通過fcntl設置不起作用。

聽起來這個錯誤在第一天就存在了,但是最近可能已經修復了(就運輸內核而言,我不確定當前狀態)。

我正在使用SuSE Linux,這是一個大約6歲的版本。

討論大約在一年前。鑑於你的內核的年齡,它肯定會受到bug的影響。

+0

我正在使用SuSE Linux,這是一個6歲左右的版本。也許這是Linux操作系統中的一個錯誤,而不是UNIX。 – Kiyomasa 2012-04-28 10:42:58

+0

@Kiyomasa:這個討論是專門針對Linux的,線程大約一歲。因此你的內核肯定會受到bug的影響。 – NPE 2012-04-28 10:48:57