Linux Web 服务器并发文件处理(读/写)

标签 linux concurrency file-handling read-write

希望您能就我的问题给我一些建议。

我得到的是一个在 Raspberry Pi 上运行的 Web 服务器。在上面,C 程序在特定时间间隔(1 秒)内写入 JPEG 文件,如下所示:

fout = fopen("/tmp/image1.jpg", "w");
fwrite(jpgBuffer, jpgFileSize, 1, fout);
fclose(fout);

我通过网络浏览器访问图像:“192.168.178.xxx/tmp/image1.jpg” 大多数情况下,图像会完美显示。但是有时我会在图像中看到伪影。

我的假设是,文件是在我从网络浏览器请求图像期间写入的。我怎样才能避免这种行为?或者我如何确保在请求期间打开文件进行读取时不写入文件。

我阅读了有关文件锁定的内容,但不确定这是否可行。我知道我可以在写入文件之前使用 flock 函数设置排他锁,然后再解锁。但我还读到相应的文件打开功能必须设置读取或共享锁才能使此方法起作用。但是我不知道我通过网络浏览器发出的http请求是否设置了这样的读锁。

如有任何建议,我们将不胜感激。

非常感谢!

最佳答案

写入另一个临时文件,然后将其重命名为“/tmp/image1.jpg”。鉴于 renamepretty atomic ,您的问题可能会得到解决。

一种可能的替代方法是使用 mandatory locks :写进程在打开文件进行读写后设置RW锁,然后内核会阻止web服务器读取文件,直到锁被移除(在写进程退出时显式或隐式)。但是,这种方法涉及额外的步骤(文件系统必须使用 "mand" 选项安装,group setgid 属性必须由 "g+s" 设置,还有 "g-x"),另外,在 linux 中强制锁的使用是 frowned upon .

关于Linux Web 服务器并发文件处理(读/写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34827340/

相关文章:

java - 在 Main 方法中运行两个线程

go - 中断当前的尾部并开始新的尾部

java - 如何解决线程饥饿?

c# - 如何在 C# 中将 FormatConvertedBitmap 转换为 Stream

linux - 如何使用eval读取变量

linux - 我如何将我的 Windows 程序编译成与 Wine 一起运行的单个 Linux 二进制文件?

python - 分块读取大文件,分块压缩和写入

c - 如何从文本文件中删除?

linux - 当没有 Internet 连接时,如何将扩展安装到作为 Remote-SSH 远程端的 VS Code 服务器中?

linux - Shell:将变量插入命令中