Re: Is anybody working on extending procdesc support to rfork?
- In reply to: Alan Somers : "Re: Is anybody working on extending procdesc support to rfork?"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 08 Jan 2026 07:14:59 UTC
On Wed, Jan 07, 2026 at 08:42:59PM -0700, Alan Somers wrote:
> On Wed, Jan 7, 2026 at 8:02 PM Rob Norris <robn@despairlabs.com> wrote:
> >
> > On Thu, 8 Jan 2026, at 1:40 PM, Konstantin Belousov wrote:
> >
> > That's fair. The bug report references discussion at
> > https://lists.cam.ac.uk/pipermail/cl-capsicum-discuss/2015-May/msg00012.html
> > which seems to be no longer available. Does anybody have a pointer
> > to it?
> >
> >
> > Looks like a change to the mailing list archive software. I guess this or something in the same thread.
> >
> > https://lists.cam.ac.uk/sympa/arc/cl-capsicum-discuss/2015-05/msg00012.html
> >
>
> Thanks for finding that! There's two important pieces of information there:
>
> * "we reserve the PID until all of its PDs had been closed". If
> that's true, then it's possible to use wait4 with process descriptors
> race-free. That would be good enough for my current purposes. A
> proper pdwait4() would still be useful for capability-mode processes,
> however.
>
> * Ed Shouten already wrote a pdwait(3) on top of kqueue (though the
> link is dead). I might be able to use that.
>
> I'll investigate both of the above points tomorrow.
I added some version of pdwait(2) as well.
Mine does not reap the referenced child, it is the job of close().
More, this allows more than one process to pdwait() and get the expected
results. I do not return pid from pdwait(), I see no point in mimicking
wait(2) there.
It worked for me with the following simple test program:
/* $Id: pdrfork.c,v 1.6 2026/01/08 07:00:36 kostik Exp kostik $ */
#include <sys/procdesc.h>
#include <sys/resource.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#ifndef SYS_pdrfork
#define SYS_pdrfork 600
static int
pdrfork(int *fdp, int pdflags, int rfflags)
{
return (syscall(SYS_pdrfork, fdp, pdflags, rfflags));
}
#endif
#ifndef SYS_pdwait
#define SYS_pdwait 601
static pid_t
pdwait(int fd, int options, int *status, struct __wrusage *wrp,
siginfo_t *sip)
{
return (syscall(SYS_pdwait, fd, options, status, wrp, sip));
}
#endif
int
main(void)
{
struct __wrusage wr;
siginfo_t si;
int error, fd, pid, pid1, status;
fd = -1;
pid = pdrfork(&fd, 0, RFPROC | RFPROCDESC);
if (pid == -1)
err(1, "pdrfork");
if (pid == 0) {
sleep(1);
_exit(12);
}
error = pdgetpid(fd, &pid1);
if (error != 0)
err(1, "pdgetpid");
printf("fd %d pid %d getpid %d\n", fd, pid, pid1);
status = -1;
error = pdwait(fd, WEXITED, &status, &wr, &si);
if (error != 0)
err(1, "pdwait");
printf("status %#x\n", status);
close(fd);
return (0);
}