Thread (20 messages) flat view 20 messages, 8 authors, 2018-11-28

Re: extending wait4(2) or waitid(2) linux syscall

From: Arnd Bergmann <arnd@arndb.de>
Date: 2018-11-26 17:15:12

On Mon, Nov 26, 2018 at 4:18 PM Florian Weimer [off-list ref] wrote:
* Arnd Bergmann:
quoted
On Thu, Nov 15, 2018 at 7:30 AM Dmitry V. Levin [off-list ref] wrote:
quoted
On Thu, Nov 15, 2018 at 06:39:03AM -0800, Arnd Bergmann wrote:
quoted
On Thu, Nov 15, 2018 at 6:05 AM Dmitry V. Levin wrote:
quoted
On Thu, Apr 20, 2017 at 03:20:51PM +0200, Albert ARIBAUD wrote:
1. strace needs a race-free invocation of wait4(2) or waitid(2)
with a different signal mask, this cannot be achieved without
an extended version of syscall, similar to pselect6(2) extension
over select(2) and ppoll(2) extension over poll(2).

Signal mask specification in linux requires two parameters:
"const sigset_t *sigmask" and "size_t sigsetsize".
Creating pwait6(2) as an extension of wait4(2) with two arguments
is straightforward.
Creating pwaitid(2) as an extension of waitid(2) that already has 5
arguments would require an indirection similar to pselect6(2).
Getting back to this point: you could also do the same thing with
the CLONE_FD approach from Josh Triplett[1] or Casey Dahlin's
older waitfd() syscall, correct?
A descriptor-based solution would not be useful to glibc because
applications assume that glibc does not (persistently) open any file
descriptors behind t heir back.
Right, makes sense. What about a temporary file descriptor as discussed
in the recent procfd() mail thread then? Would that work?

/* for illustration, needs error handling and more features */
int pwait(pid_t id, siginfo_t *infop)
{
      char waitfd_file[MAX_PROCFD_LEN];
      struct pollfd pfd[1] = { {.events = POLLIN }};

      snprintf(waitfd_file, MAX_PROCFD_LEN, "/proc/%d/wait", pid);
      pfd.fd = open(waitfd_file,  O_RDONLY);
      ppoll(&pfd, 1, NULL, sigmask);
      read(fd, infop, sizeof(*infop));
      close(fd);

     return 0;
}

       Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help