4

我编写了一个简短的 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");
}

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

4

1 回答 1

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 年的历史。

讨论是从大约一年前开始的。考虑到内核的年龄,它肯定会受到错误的影响。

于 2012-04-28T10:26:16.940 回答