使文件只出现在一个库函数中

我正在使用一个库,可以从文件中读取或写入一些我需要的元数据。

我只需要阅读,我知道我的文件存储缓慢。

我注意到,在阅读我需要的值非常快时,closures文件很慢。 基本上,如果我open(); read(); close() open(); read(); close() open(); read(); close()每个文件我的程序是相当慢,但如果我只open(); read() 在操作过程中open(); read()和在退出前close() (即让我的运行时间在泄漏对象的最终化期间closures文件)程序运行得很快,但在退出之前停止几秒钟 – 文件正在closures。

另一方面,如果我从文件中删除写入权限,则不会发生这种情况:似乎以只读方式打开的文件比打开读写文件更快地closures。 如果文件是可写的,或者其他原因,可能是库在closures“只是要确定”的情况下写入元数据 – 但无论如何,不​​可能为库指定我不打开文件仅用于读取:它试图变得聪明,并根据文件权限来决定。

目前为了加快速度,在打开文件权限之前更改文件权限,并在读取元数据之后恢复权限。 它有效,但感觉不对。

有没有办法在linux / unix中使文件暂时显示为当前进程的只读? 我不能使用setuid(2),因为程序是由无特权的用户运行的(或者我错了吗?)。

细节

这个库是taglib-ruby ,它又是taglib的C ++ API的一个包装器。

该程序可能会列出设备上的轨道,需要知道它们的长度(我使用taglib的原因),但同样的媒体将被写入(新轨道上传,一些轨道删除),因此我不能只强制用户只读设备。

我意识到一个更好的解决scheme是将taglib修补为允许指定我只想读取元数据,然后修补taglib-ruby来包装新的API。 但是我没有做到这一点,加上我已经有了一个解决方法,因此没有太多的东西要走下去。 我只是想知道是否有更好的解决方法。

在C ++中,你可以这样做:(我希望你也可以用ruby来做)

 TagLib::IOStream * stream = new TagLib::FileStream("blow.mp4", true); TagLib::MP4::File * file = new TagLib::MP4::File( stream ); TagLib::FileRef * fileref = new TagLib::FileRef( file ); TagLib::String artist = fileref->tag()->artist(); 

这里,FileStream的构造函数的第二个参数表示只读。 我已经确认使用“strace”开放系统调用与O_RDONLY调用