Re: [PATCH 2/3] daemon: use sigaction() to install child_handler()
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 24, 2025, 15:37 UTC
- Message-ID
- <xmqqv7ol177p.fsf@gitster.g>
- In-Reply-To
- <2e8c4643a60e354d24bda9bf364e1b34ce1c45ae.1750774122.git.gitgitgadget@gmail.com>
"Carlo Marcelo Arenas Belón via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 7 quoted lines
> From: =?UTF-8?q?Carlo=20Marcelo=20Arenas=20Bel=C3=B3n?= <carenas@gmail.com> > > In a future change, the flags used for processing SIGCHLD will need to > be updated, which is only possible by using sigaction(). > > Replace the call, which hs the added benefit of using BSD semantics > reliably and therefore not needing the rearming call.
"hs" -> "has"
Hmph, if we do not have to rearm, do we even need to have the handler at all, now it is a completely empty function? Presumably we'll see the answer to this question in the next step?
Show 39 quoted lines
> Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
> ---
> daemon.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/daemon.c b/daemon.c
> index d1be61fd5789..d870ad2f63c1 100644
> --- a/daemon.c
> +++ b/daemon.c
> @@ -917,9 +917,7 @@ static void child_handler(int signo UNUSED)
> /*
> * Otherwise empty handler because systemcalls will get interrupted
> * upon signal receipt
> - * SysV needs the handler to be rearmed
> */
> - signal(SIGCHLD, child_handler);
> }
>
> static int set_reuse_addr(int sockfd)
> @@ -1121,6 +1119,7 @@ static void socksetup(struct string_list *listen_addr, int listen_port, struct s
> static int service_loop(struct socketlist *socklist)
> {
> struct pollfd *pfd;
> + struct sigaction sa;
>
> CALLOC_ARRAY(pfd, socklist->nr);
>
> @@ -1129,7 +1128,10 @@ static int service_loop(struct socketlist *socklist)
> pfd[i].events = POLLIN;
> }
>
> - signal(SIGCHLD, child_handler);
> + sigemptyset(&sa.sa_mask);
> + sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
> + sa.sa_handler = child_handler;
> + sigaction(SIGCHLD, &sa, NULL);
>
> for (;;) {
> check_dead_children();