Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Oct 2011 13:51:26 +0200
From:      =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no>
To:        Pawel Jakub Dawidek <pjd@FreeBSD.org>
Cc:        current@freebsd.org
Subject:   Re: incorrect use of pidfile(3)
Message-ID:  <86botlaz41.fsf@ds4.des.no>
In-Reply-To: <20111013113024.GE1667@garage.freebsd.pl> (Pawel Jakub Dawidek's message of "Thu, 13 Oct 2011 13:30:26 %2B0200")
References:  <86pqi1b1qp.fsf@ds4.des.no> <20111013113024.GE1667@garage.freebsd.pl>

next in thread | previous in thread | raw e-mail | index | archive | help
Pawel Jakub Dawidek <pjd@FreeBSD.org> writes:
> Dag-Erling Sm=C3=B8rgrav <des@des.no> writes:
> > How do we fix this?  My suggestion is to loop until pidfile_open()
> > succeeds or errno !=3D EAGAIN.  Does anyone have any objections to that
> > approach?
> I think we already do that internally in pidfile_open(). Can you take a l=
ook at
> the source and confirm that this is what you mean?

No, it doesn't; pidfile_open(3) returns NULL with errno =3D=3D EAGAIN if the
pidfile is locked but empty, as is the case in the window between a
successful pidfile_open(3) and the first pidfile_write(3).  This is
documented in the man page:

     [EAGAIN]           Some process already holds the lock on the given pi=
d=E2=80=90
                        file, but the file is truncated.  Most likely, the
                        existing daemon is writing new PID into the file.

I have a patch that adds a pidfile to dhclient(8), where I do this:

        for (;;) {
                pidfile =3D pidfile_open(path_dhclient_pidfile, 0600, &othe=
rpid);
                if (pidfile !=3D NULL || errno !=3D EAGAIN)
                        break;
                sleep(1);
        }
        if (pidfile =3D=3D NULL) {
                if (errno =3D=3D EEXIST)
                        error("dhclient already running, pid: %d.", otherpi=
d);
                warning("Cannot open or create pidfile: %m");
        }

I'm not sure I agree with the common idiom (which I copied here) of
ignoring all other errors than EEXIST, but that's a different story.

DES
--=20
Dag-Erling Sm=C3=B8rgrav - des@des.no



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86botlaz41.fsf>