pidwait waits for only half of the given processes
Apparently `pidwait` waits for only half of the given processes. bash example to reproduce: ``` $ for i in {2,4}; do sleep $i & done; time pidwait -u $LOGNAME sleep [1] 8630 [2] 8631 [1]- Done sleep $i real 0m2.005s user 0m0.012s sys 0m0.015s ``` You see that `pidwait` takes only 2 seconds but it should take 4 seconds if it waited for the `sleep 4` command. `strace` shows why this is: ``` pidfd_open(8659, 0) = 4 epoll_ctl(3, EPOLL_CTL_ADD, 4, {events=EPOLLIN|EPOLLET, data=0x4}) = 0 pidfd_open(8660, 0) = 5 epoll_ctl(3, EPOLL_CTL_ADD, 5, {events=EPOLLIN|EPOLLET, data=0x5}) = 0 epoll_wait(3, [{events=EPOLLIN, data=0x4}], 32, -1) = 1 epoll_wait(3, [{events=EPOLLIN|EPOLLHUP, data=0x4}], 32, -1) = 1 ``` It seems that for each finished process there are 2 epoll events: one `EPOLLIN` and one `EPOLLIN|EPOLLHUP`. I suppose that `EPOLLIN` occurs when the process has exited and `EPOLLIN|EPOLLHUP` occurs when the process has been collected by `wait` or `waitpid`. Since the `pidwait` code merely counts the epoll events that have EPOLLIN set it counts every terminated process twice so that it only waits for half of the given processes. BTW, the `pidwait` manpage doesn't clearly specify if it waits for processes until they have exited or until they have been collected (it might be worth having a commandline option to distinguish between the two). ``` $ ps --info BSD j OL_j BSD l OL_l BSD s OL_s BSD u OL_u BSD v OL_v SysV -f (none) SysV -fl (none) SysV -j (none) SysV -l (none) procps-ng version 4.0.4 Compiled with: glibc 2.40, gcc 15.0 header_gap=-1 lines_to_next_header=1 screen_cols=129 screen_rows=48 personality=0x00000000 (from "unknown") EUID=1000 TTY=136,7 page_size=4096 sizeof(proc_t)=8 sizeof(long)=8 sizeof(long)=8 archdefs: x86_64 ```
issue