fcntl:打开和关闭磁盘缓冲

时间:2012-04-28 10:14:59

标签: c linux unix

我写了一个简短的C程序来打开和关闭unix文件缓冲。下面的代码是打开它。我使用fcntl来获取设置,设置O_SYNC标志,然后将设置写回内核。但是当我再次获得设置时,它们没有设置O_SYNC标志。

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");
}

任何帮助将不胜感激。干杯:)

1 个答案:

答案 0 :(得分:2)

我在Linux内核列表中找到了这个讨论:http://choon.net/forum/read.php?21,22539

简而言之:

  

问题是fcntl(fd, F_SETFL, flags|O_SYNC)似乎有效,但默认忽略O_SYNC标志。   使用O_SYNC打开文件可以正常工作,但稍后通过fcntl进行设置无效。

听起来这个bug从第一天开始就存在,但最近可能已经修复了(就运输内核而言,我不确定目前的状态)。

  

我使用的是SuSE Linux,这是一个大约6年的版本。

讨论大约一年前。鉴于你的内核的年龄,它肯定受到bug的影响。