linux - 使文件对库函数显示为只读

标签 linux unix file-permissions

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

我只需要阅读,我就知道我的文件存储速度较慢。

我注意到,虽然读取我需要的值非常快,但关闭文件却很慢。基本上,如果我 open(); read(); close()我的程序的每个文件都非常慢,但如果我只 open(); read()操作期间和 close()就在退出之前(即,我让运行时在泄漏对象的最终确定期间关闭文件),程序运行得很快,但在退出之前停止了几秒钟 - 当文件被关闭时。

另一方面,如果我从文件中删除写入权限,则不会发生这种情况:似乎以只读方式打开的文件比以读写方式打开的文件关闭得快得多。可能是库在关闭时写入元数据“只是为了确定”文件是否可写,或者其他原因,但无论如何 - 不可能为库指定我不想打开文件仅用于读取:它尝试变得智能并根据文件权限做出决定。

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

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

详情

图书馆是 taglib-ruby这又是 taglib 的包装器的 C++ API。

程序可能会列出设备上的轨道,并且需要以秒为单位知道它们的长度(我使用 taglib 的原因),但相同的媒体将被写入(上传新轨道,删除一些轨道),因此我不能只是强制用户以只读方式安装设备。

我意识到更好的解决方案是修补 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 调用的

关于linux - 使文件对库函数显示为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989247/

相关文章:

regex - 在多个日志文件中查找模式?

linux - 无法在 avrdude 版本 6.0.1 中使用 avrisp mkII 进行刷新

linux - 将文件中的文本字符串附加到命令

linux - 在 shell 中读取命令

c - 为什么在 BSS 和数据段中将不同大小的内存分配给整数?

linux - 定期检查文件夹是否已在目录中创建

sockets - 带有 UDP 数据报的 SO_REUSEADDR - 资源不可用

php - 在图片上传时设置 chmod 777

go - 如何将文件模式转换为 int?

PHP/IIS copy()/move_uploaded_file() 无法打开流 : Permission denied Warning