@@ -567,6 +567,7 @@ cmd_update(int argc, char *argv[])
567
567
568
568
#ifdef STRESS_TEST
569
569
570
+ int parent_pid = -1 ;
570
571
static int process_pid = -1 ;
571
572
static char test_log_base [PATH_MAX - sizeof ("-4194304" )];
572
573
static char test_log_name [PATH_MAX ];
@@ -647,16 +648,53 @@ static int stress_test_log_init(int is_base_process)
647
648
return 0 ;
648
649
}
649
650
651
+ void stress_test_notify_parent ()
652
+ {
653
+ if (parent_pid < 0 )
654
+ return ;
655
+ union sigval code ;
656
+ code .sival_int = process_pid ;
657
+ sigqueue (parent_pid , SIGCHLD , code );
658
+ }
659
+
660
+ void stress_test_signal_handler (int sig , siginfo_t * info , void * ucontext )
661
+ {
662
+ switch (sig ) {
663
+ case SIGCHLD : {
664
+ if (info -> si_code == SI_QUEUE ) {
665
+ kpinfo ("Child process pid %d fatal error.\n" , info -> si_pid );
666
+ return ;
667
+ } else {
668
+ int pid , status ;
669
+ while ((pid = waitpid (-1 , & status , WNOHANG )) > 0 )
670
+ kpinfo ("Child process pid %d exited.\n" , pid );
671
+ return ;
672
+ }
673
+ break ;
674
+ }
675
+ }
676
+ }
677
+
678
+ void stress_test_install_sigaction ()
679
+ {
680
+ struct sigaction sigact ;
681
+ sigemptyset (& sigact .sa_mask );
682
+ sigact .sa_flags = SA_SIGINFO | SA_RESTART ;
683
+ sigact .sa_sigaction = & stress_test_signal_handler ;
684
+ sigaction (SIGCHLD , & sigact , NULL );
685
+ }
686
+
650
687
static int cmd_stress_test (int fd , int argc , char * argv [])
651
688
{
652
689
if (sscanf (argv [1 ], "%d" , & process_pid ) != 1 ) {
653
690
kplogerror ("Can't parse pid from %s\n" , argv [1 ]);
654
691
return -1 ;
655
692
}
656
- kpinfo ("Spawning child to patch pid %d\n" , process_pid );
657
693
694
+ parent_pid = getpid ();
658
695
int child = fork ();
659
696
if (child == 0 ) {
697
+ signal (SIGCHLD , SIG_IGN );
660
698
log_file_free ();
661
699
if (stress_test_log_init (0 ))
662
700
kpfatal ("Can't initialize log.\n" );
@@ -666,6 +704,7 @@ static int cmd_stress_test(int fd, int argc, char *argv[])
666
704
log_file_free ();
667
705
exit (rv );
668
706
}
707
+ kpinfo ("Spawned child %d to patch pid %d\n" , child , process_pid );
669
708
close (fd );
670
709
return 0 ;
671
710
}
@@ -1020,7 +1059,8 @@ int main(int argc, char *argv[])
1020
1059
#ifdef STRESS_TEST
1021
1060
if (argc < 3 )
1022
1061
return usage ("not enough arguments." );
1023
- signal (SIGCHLD , SIG_IGN );
1062
+
1063
+ stress_test_install_sigaction ();
1024
1064
return cmd_server (argc , argv );
1025
1065
#else
1026
1066
if (argc < 1 )
0 commit comments