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



我希望你能给我一些关于我的问题的建议。

我得到的是一个在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"大多数情况下,图像显示完美。但是,有时我会在图像中看到伪影。

我的假设是,在我从 Web 浏览器请求图像期间写入文件。如何避免此行为?或者我如何确保在请求期间打开文件进行读取时不会写入文件。

我读过文件锁定,但不确定这是否是要走的路。我知道我可以在写入文件之前使用 flock 功能设置独占锁,然后在之后解锁。但我也读到,相应的文件打开函数必须设置读取或共享锁才能使此方法正常工作。但是我不知道我通过网络浏览器发出的http请求是否设置了这样的读锁定。

任何建议不胜感激。

多谢!

写入另一个临时文件,然后将其重命名为"/tmp/image1.jpg"。鉴于rename非常原子,您的问题可能会得到解决。

一种可能的替代方法是使用强制锁:写入过程在打开文件进行读取和写入后设置 RW 锁,然后内核将阻止 Web 服务器读取文件,直到锁被删除(在写入过程退出时显式或隐式)。但是,这种方法涉及额外的步骤(文件系统必须使用 "mand" 选项挂载,组 setgid 属性必须由 "g+s" 设置,也"g-x"),此外,在 linux 中使用强制锁是不受欢迎的。

最新更新