C   18

exec

Guest on 21st September 2022 01:43:07 PM

  1. #include <sys/types.h>
  2. #include <sys/wait.h>
  3. #include <sys/signal.h>
  4. #include <sys/procctl.h>
  5. #include <errno.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <errno.h>
  9. #include <stdint.h>
  10. #include <unistd.h>
  11. #include <signal.h>
  12. #include <err.h>
  13.  
  14. #include <stdio.h>
  15.  
  16. int
  17. main(int argc, char **argv)
  18. {
  19.         char *plop[2];
  20.         procctl(P_PID, getpid(), PROC_REAP_ACQUIRE, NULL);
  21.         pid_t pid;
  22.         int pstat;
  23.         struct procctl_reaper_status info;
  24.  
  25.         plop[0] = "sh";
  26.         plop[1] = NULL;
  27.  
  28.         if ((pid = fork()) == 0)
  29.                 execvp("/bin/sh", argv);
  30.        
  31.         procctl(P_PID, getpid(), PROC_REAP_STATUS, &info);
  32.         printf("%s: %d\n", "la", info.rs_children);
  33.         while (waitpid(pid, &pstat, 0) == -1) {
  34.                 if (errno != EINTR)
  35.                         break;
  36.                        
  37.         }
  38.         printf("%s\n", "la2");
  39.        
  40.         sleep(1);
  41.         procctl(P_PID, getpid(), PROC_REAP_STATUS, &info);
  42.         while (info.rs_children > 0) {
  43.                 printf("====>%d\n", info.rs_children);
  44.                 printf("====>%d: killing %d\n", getpid(), info.rs_pid);
  45.                 kill(info.rs_pid, SIGTERM);
  46.                 while (waitpid(info.rs_pid, &pstat, 0) == -1) {
  47.                         if (errno != EINTR)
  48.                                 err(1, "plop");
  49.                 }
  50.                 procctl(P_PID, getpid(), PROC_REAP_STATUS, &info);
  51.         }
  52.  
  53. }

Raw Paste


Login or Register to edit or fork this paste. It's free.