Cómo terminar un proceso hijo que ejecuta otro progtwig haciendo exec

Estoy haciendo un fork en mi progtwig principal y ejecutando exec en el proceso hijo que ejecutará otro progtwig. Ahora quiero terminar el progtwig secundario (es decir, el progtwig invocado por exec) y volver al progtwig principal (o progtwig principal). ¿Cómo podría lograr esto? Lo intenté con ctrl + c, pero su proceso matador de padres y su hijo también. Por favor, ayúdenme.

/*This is main.c*/ #include  #include  #include  #include  #include  #include  void sig_int(void); void sig_term(void); pid_t pid,ppid; int main(char argc,char **argv){ int n; char ch; printf("***********Application to start or stop services**********\n"); do { printf("Enter 1 to start service no.1\n"); printf("Enter 2 to start service no.2\n"); printf("Enter 3 to start service no.3\n"); scanf("%d",&n); if(fork() == 0) { switch(n) { case 1: printf("starting service no. 1..\n"); printf("checking whether the given service is already running...\n"); // system("./det.sh ./test") pid = getpid(); printf("child process pid = %d\n",pid); // signal(SIGINT,(void *)sig_int); // signal(SIGTERM,(void *)sig_term); //execl("/var/vR_main","vR_main",argv[1],argv[2],argv[3],argv[4],NULL); execl("./test","test",0,0);//will run test.c break; case 2: printf("starting service no. 2..\n"); break; case 3: printf("starting service no. 3..\n"); break; } } else { int status; wait(&status); if (WIFEXITED(status)) printf("CHILD exited with %d\n", WEXITSTATUS(status)); if (WIFSIGNALED(status)) printf("signaled by %d\n", WTERMSIG(status)); if (WIFSTOPPED(status)) printf("stopped by %d\n", WSTOPSIG(status)); // sleep(2); ppid = getpid(); printf("%d\n",ppid); // wait(); printf("\nDo you want to continue...y/n:"); scanf(" %c",&ch); } }while(ch == 'y'); return 0; } void sig_int(void) { printf("caught signal\n"); kill(pid,SIGKILL); // signal(SIGINT,SIG_DFL); // exit(0); } void sig_term(void) { printf("killing the process\n"); signal(SIGINT,SIG_DFL); // exit(0); } /*This is test.c*/ #include  #include  #include  #include  #include  void sig_int(void); void sig_term(void); pid_t pid; int main() { // int a=10,b=40,c=50,max; pid = getpid(); printf("exec pid = %d\n",pid); while (1) { signal(SIGINT,(void *)sig_int); signal(SIGTERM,(void *)sig_term); } // max=a>b?a>c?a:c:b>c?b:c; // printf("%d\n",max); } void sig_int(void) { printf("caught signal\n"); // signal(SIGINT,SIG_DFL); kill(pid,SIGKILL); // exit(0); } void sig_term(void) { printf("killing the process\n"); signal(SIGINT,SIG_DFL); // exit(0); } 

Ahora quiero eliminar la “aplicación de prueba” (invocada por exec) y volver al proceso principal o al “bloque else” para continuar con el progtwig.

Necesitas hacer lo siguiente:

  1. Haga primero una kill(pid, SIGTERM ): esto le da al proceso del niño la oportunidad de terminar con gracia
  2. Espera un periodo de tiempo (usa el sleep ). El período de tiempo depende del tiempo que tarda el proceso secundario en cerrarse con gracia.
  3. Utilice waitpid(pid, &status, WNOHANG) verificar el valor de retorno. Si el proceso no se ha abortado, hacer el paso 4.
  4. Haz una kill(pid, SIGKILL ) y luego cosecha al zombi haciendo waitpid(pid, &status, 0) .

Estos pasos aseguran que le das al proceso hijo un cierre de señal para que se cierre y también te asegura que no tienes procesos zombie.

Dentro o fuera de su progtwig, es posible usar kill . Al incluir , puede finalizar un proceso con un PID determinado (para ello, utilice el valor de retorno de la fork ).

 #include  int pid; switch (pid = fork()) { case -1: /* some stuff */ break; case 0: /* some stuff */ break; default: /* some stuff */ kill(pid, SIGTERM); } 

También es posible usar el comando kill en el shell. Para encontrar el PID de su proceso hijo, puede ejecutar el comando ps .

hombre matar
La función kill() enviará una señal a un proceso o un grupo de procesos especificados por pid. La señal que se enviará está especificada por sig y es una de la lista que figura en o 0. Si sig es 0 (la señal nula), se realiza la verificación de errores, pero no se envía ninguna señal. La señal nula se puede utilizar para verificar la validez de pid.

POSIX define la llamada al sistema kill (2) para esto:

 kill(pid, SIGKILL);