【问题标题】:Linux Webserver concurrent file handling (read/write)Linux Webserver 并发文件处理(读/写)
【发布时间】:2016-01-16 13:09:58
【问题描述】:

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

我得到的是在 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请求是否设置了这样的读锁。

欢迎提出任何建议。

非常感谢!

【问题讨论】:

    标签: linux concurrency file-handling read-write


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多