Re: My way to check if a progam is already running



Jan Panteltje <pNaonStpealmtje@xxxxxxxxx> writes:
On a sunny day (Mon, 25 Jun 2007 10:30:28 +0200) it happened Rainer Weikusat
<rweikusat@xxxxxxxxxxx> wrote in <87k5tsbfmj.fsf@xxxxxxxxxxxxxxxxx>:

Jan Panteltje <pNaonStpealmtje@xxxxxxxxx> writes:

[...]


/* test if file is locked */
i = 0;
while(1)
{
a = lockf(fileno(lockfile), F_TEST, 0);
if(a != -1) break;

if(errno != EAGAIN)
{
fprintf(stderr, "MyProgram: An other MyProgram is already running, aborting.\n");

exit(1);
}

i++;
if(i == 1000) // 10 S
{
fprintf(stderr, "MyProgram: timeout EAGAIN waiting for lockf() F_TEST, aborting.\n");

exit(1);
}

usleep(10000); // 10 ms
}

This loop is totally useless, because by the time you do the second
lockf call, the file may or may not be locked and it doesn't matter
what another lockf call happening in the past returned.

EAGAIN means test again, and I have tested this soft and forced the EAGAIN condition.
Unless (we still have to look at the lockf() source) EAGAIN is used
wrongly, the loop is correct.

I didn't claim it was wrong but that it wouldn't do anything useful.
Which it doesn't. The 'real test' is the lock(..., F_TLOCK in the
second loop and that will or will not succeed, no matter how many
times F_TEST succeeded or didn't succeed before.
.



Relevant Pages

  • Re: My way to check if a progam is already running
    ... what another lockf call happening in the past returned. ... EAGAIN means test again, and I have tested this soft and forced the EAGAIN condition. ... The 'real test' is the lock(..., ... *fer crissake* 'the second loop' refers to THE SECOND LOOP, ...
    (comp.os.linux.development.apps)
  • Re: My way to check if a progam is already running
    ... This loop is totally useless, because by the time you do the second ... what another lockf call happening in the past returned. ... EAGAIN means test again, and I have tested this soft and forced the EAGAIN condition. ... but errno was EAGAIN then what would you do? ...
    (comp.os.linux.development.apps)
  • Re: Program hanging when read()ing from pipe
    ... the descriptor to non-blocking and loop readuntil you get EAGAIN. ... EAGAIN doesn't mean the program is terminated. ...
    (comp.unix.programmer)
  • Re: While(1) or for(;;) for infinite loops?
    ... looked, at first glance, like it was the top of a while loop rather ... /* Tries to complete the connection on 'stream', ... If 'stream''s connection is complete, ... returns EAGAIN. ...
    (comp.lang.c)
  • Re: My way to check if a progam is already running
    ... what another lockf call happening in the past returned. ... EAGAIN means test again, and I have tested this soft and forced the EAGAIN condition. ... Unless source) EAGAIN is used wrongly, the loop is correct. ...
    (comp.os.linux.development.apps)