[2/2] app/pdump: handle SIGTERM and SIGHUP
Checks
Commit Message
Like dumpcap, the pdump process should cleanup if process
terminates due to being killed or hangup.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
app/pdump/main.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
Comments
> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> + sigaction(SIGHUP, NULL, &origaction);
Why do we need this ? Can't be this direct sigaction(SIGHUP, &action, NULL) without a below if code?
Can you please explain how this works.
> + if (origaction.sa_handler == SIG_DFL)
> + sigaction(SIGHUP, &action, NULL);
>
Other changes looks ok to me.
Regards,
Reshma
On Tue, 27 Feb 2024 09:59:37 +0000
"Pattan, Reshma" <reshma.pattan@intel.com> wrote:
> > -----Original Message-----
> > From: Stephen Hemminger <stephen@networkplumber.org>
> > + sigaction(SIGHUP, NULL, &origaction);
>
> Why do we need this ? Can't be this direct sigaction(SIGHUP, &action, NULL) without a below if code?
> Can you please explain how this works.
>
> > + if (origaction.sa_handler == SIG_DFL)
> > + sigaction(SIGHUP, &action, NULL);
> >
>
If sighup is being ignored already (for example being run by nohup)
then the program should keep ignoring SIGHUP.
This is the method used in tshark and dumpcap utilities in wireshark
and it made sense.
@@ -571,11 +571,9 @@ disable_primary_monitor(void)
}
static void
-signal_handler(int sig_num)
+signal_handler(int sig_num __rte_unused)
{
- if (sig_num == SIGINT) {
- quit_signal = 1;
- }
+ quit_signal = 1;
}
static inline int
@@ -975,6 +973,11 @@ enable_primary_monitor(void)
int
main(int argc, char **argv)
{
+ struct sigaction action = {
+ .sa_flags = SA_RESTART,
+ .sa_handler = signal_handler,
+ };
+ struct sigaction origaction;
int diag;
int ret;
int i;
@@ -983,8 +986,14 @@ main(int argc, char **argv)
char mp_flag[] = "--proc-type=secondary";
char *argp[argc + 2];
- /* catch ctrl-c so we can print on exit */
- signal(SIGINT, signal_handler);
+ /* catch ctrl-c so we can cleanup on exit */
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGTERM, &action, NULL);
+ sigaction(SIGINT, &action, NULL);
+ sigaction(SIGPIPE, &action, NULL);
+ sigaction(SIGHUP, NULL, &origaction);
+ if (origaction.sa_handler == SIG_DFL)
+ sigaction(SIGHUP, &action, NULL);
argp[0] = argv[0];
argp[1] = n_flag;