Linux Webserver并发文件处理(读/写)

时间:2016-01-16 13:09:58

标签: 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函数设置一个独占锁,然后解锁它。但我还读到相应的文件打开函数必须设置读取或共享锁定才能使此方法起作用。但是我不知道我通过Web浏览器发出的http请求是否设置了这样的读锁定。

任何建议都表示赞赏。

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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