boost interprocess file_lock does not work with multiple processes
Asked Answered
O

3

3

I seem to be having an issue with boost::interprocess::file_lock

I have process 1 that is essentially

    boost::interprocess::file_lock test_lock("testfile.csv");
    test_lock.lock();
    sleep(1000);
    test_lock.unlock();

When I run a second process while the first process is sleeping, I find that I am still able to read testfile.csv. What's worse, I can even overwrite it.

Am I misinterpreting how file_lock works? I was under the impression that calling .lock() gives it exclusive lock over the file and prevents any other process from read/modifying the file.

Ordzhonikidze answered 14/7, 2011 at 17:51 Comment(0)
C
13

file_lock is not for locking a file. It is a mutual exclusion object that uses a file as its backing technology. The contents of the file are basically irrelevant; what is relevant is that all instances of a file_lock pointing to that file will respect the locking characteristics of the lock.

As with any mutex-type object, the lock itself is there to protect or otherwise meter access to some other resource.

It has nothing to do with filesystem protection of files.

Reference

Curvilinear answered 14/7, 2011 at 18:7 Comment(0)
S
5

To ensure portability the kind of lock you are expecting doesn't exist in boost. There is no kernel level enforceable lock on the Unix/Linux/OSX OS's that boost supports.

see:

http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock

Because of this the boost interprocess lock is an advisory or cooperative lock. You can accomplish what you are trying to do with boost::interprocess::file_lock but, you must also use the interprocess::file_lock in other processes that might try to read/write the file. Simply try to acquire the lock in your other process before accessing the file.

This is how interprocess::file_lock was designed to be used. You can do it some OS specific way that enforces kernel level locking if you are on some OS's, but if you use the boost::interprocess::file_lock, your code will be portable.

Stambaugh answered 24/10, 2012 at 16:13 Comment(0)
P
0

Its not a filesystem lock.

Simply locking in one process is not going to prevent another process from accessing the file. Think of it "like" a mutex. To have your second process honor the file_lock, you need to acquire the lock in the 2nd process as well. Then you will see that proc2 will block, waiting for proc1 to release the lock.

Petrography answered 14/7, 2011 at 18:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.