With this flag: - pidfd_open() doesn't require that the target task must be a thread-group leader - pidfd_poll() succeeds when the task exits and becomes a zombie (iow, passes exit_notify()), even if it is a leader and thread-group is not empty. This means that the behaviour of pidfd_poll(PIDFD_THREAD, pid-of-group-leader) is not well defined if it races with exec() from its sub-thread; pidfd_poll() can succeed or not depending on whether pidfd_task_exited() is called before or after exchange_tids(). Perhaps we can improve this behaviour later, pidfd_poll() can probably take sig->group_exec_task into account. But this doesn't really differ from the case when the leader exits before other threads (so pidfd_poll() succeeds) and then another thread execs and pidfd_poll() will block again. thread_group_exited() is no longer used, perhaps it can die.
Showing the changes to include/uapi (1 of 7 files). Show all
Unified · Split
| @@ -7,6 +7,7 @@ · 6 unmodified lines | |||
| 7 | #include <linux/fcntl.h> | 7 | #include <linux/fcntl.h> |
| 8 | 8 | ||
| 9 | /* Flags for pidfd_open(). */ | 9 | /* Flags for pidfd_open(). */ |
| 10 | #define PIDFD_NONBLOCK O_NONBLOCK | 10 | #define PIDFD_NONBLOCK O_NONBLOCK |
| 11 | #define PIDFD_THREAD O_EXCL | ||
| 11 | 12 | ||
| 12 | #endif /* _UAPI_LINUX_PIDFD_H */ | 13 | #endif /* _UAPI_LINUX_PIDFD_H */ |