Lisp HUG Maillist Archive

Locking a file for exclusive access

Hello all,

I'm trying to use a "lock file" as a mean to check if there are 2 
instances of my delivered program running.

First step is testing it, so here goes...

In a first instance of the lispworks IDE i define this :

(defvar *lock-file* nil)

(defun create-lock-file ()
  (setf *lock-file*
        (open (dir+filename (data-path) "test.lock")
              :direction :output
              :if-exists :supersede
              :if-does-not-exist :create)))

and  execute the create-lock-file function, leaving the stream open. I 
can see the file being created on my hard drive.

Then i do the same in a second instance of the IDE.. and get no error !
Even writing to the stream and calling finish-output appears to be working.
I can open the file in notepad but cannot save it.
I tried also :if-exists :overwrite.

So here is my question : how can I ensure the stream i open is 
exclusively owned by my application ?

Thanks in advance,
Sacha


Re: Locking a file for exclusive access


> I'm trying to use a "lock file" as a mean to check if there are 2 
> instances of my delivered program running.
>
> First step is testing it, so here goes...
>
> In a first instance of the lispworks IDE i define this :
>
> (defvar *lock-file* nil)
>
> (defun create-lock-file ()
>  (setf *lock-file*
>        (open (dir+filename (data-path) "test.lock")
>              :direction :output
>              :if-exists :supersede
>              :if-does-not-exist :create)))
>
> and  execute the create-lock-file function, leaving the stream open. I 
> can see the file being created on my hard drive.
>
> Then i do the same in a second instance of the IDE.. and get no error !
> Even writing to the stream and calling finish-output appears to be 
> working.
> I can open the file in notepad but cannot save it.
> I tried also :if-exists :overwrite.
>
> So here is my question : how can I ensure the stream i open is 
> exclusively owned by my application ?
I think if you change :if-exists from :supersede to :error, it will do 
what you want.

Mitch


Updated at: 2020-12-10 08:43 UTC