我写了一个UNIX守护进程(针对Debian,但它没关系)我想提供一些创建“pid文件”的方法(一个包含守护进程的进程标识符的文件).
基本上,我可以这样做:
if (fileexists()) { //fail... } else { //create it with fopen() or similar }
但就目前而言,这段代码不会以原子方式执行任务,这样做会很危险,因为另一个进程可能会在我的测试和文件创建过程中创建文件.
你们对如何做到这一点有什么想法吗?
谢谢.
P.S:仅涉及std :: streams的解决方案的奖励点.
解决方法
男子2开放:
O_EXCL Ensure that this call creates the file: if this flag is specified in conjunction with O_CREAT,and pathname already exists,then open()
will fail. The behavior of O_EXCL is undefined if O_CREAT is not specified.
所以,你可以调用fd = open(name,O_CREAT | O_EXCL,0644); / * Open()是原子的. (因为某种原因) */
更新:当然,或者你应该将其中一个O_RDONLY,O_WRONLY或O_RDWR标志放入flags参数中.