Attempts to obtain a lock, returning true
if the lock is obtained, and false
if there was an existing incompatible lock held. A process may hold only one type of lock (shared or exclusive) on a file. When a process terminates in any way, the lock is released.
Assumes the file is unlocked.
TODO: integrate with async I/O