Ciao a tutti, ho un problema con la gestione di un processo figlio e il figlio del figlio
Descrizione:
2 programmi scritti in c, il primo deve avere il ruolo di controllore, il secondo è lo script che esegue i comandi.
Lo scopo del controllore è quello di verificare lo stato del programma 2 e nel caso ucciderlo.
Soluzione:
programma 1
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include </usr/include/signal.h>
#define KEY (key_t) 7890
#define PERMESSI 0666
int main (int argc, char *argv[])
{
int PID,contatore;
char Buffer[20];
int shmidP,shmidF;
char *amemP,*damemF;
if (PID = fork()) // Processo padre
{
shmidP = shmget(KEY,sizeof(Buffer),IPC_CREAT|0666);
amemP = (char *)shmat(shmidP,0,0);
strcpy(Buffer,amemP);
for (contatore = 0; (contatore <= 10)&&(strstr(Buffer,"Completo") == NULL);contatore++)
{
sleep(1);
strcpy(Buffer,amemP);
}
if (strstr(Buffer,"Completo") == NULL) kill(PID,SIGTERM);
shmctl(shmidP, IPC_RMID, NULL);
}
else // Processo figlio
{
shmidF = shmget(KEY,sizeof(Buffer),IPC_CREAT|0666);
damemF = (char *)shmat(shmidF,0,0);
strcpy(damemF,"Lanciato");
execl("/main/devel/programma2","programma2",argv[1],argv[2],argv[3],NULL);
strcpy(damemF,"Completo");
shmctl(shmidF, IPC_RMID, NULL);
exit(0);
}
}
Ovviamente questo non funziona, o meglio , il processo padre non si accorge se il figlio esce correttamente ed attende lo stesso che scada il timeout per killare il figlio.
(dovuto al fatto che execl si sotituisce al processo che lo invoca)
Nel caso usi system() al posto di execl funziona tutto se non che restano dei processi stoppati con il nome programma2. Come posso rimuoverli ?
Grazie