Ciao a tutti,
Sto cercando di completare un esercizio ma sto incontrando difficoltà.
In sostanza devo emulare una shell ed eseguire i comandi in background e foreground, monitorando lo stato.
Riporto un esempio
root/root> ls&
Padre [1006]
root/root> Figlio [1007]
input.c input.o makefile note.txt smallsh smallsh.c smallsh.h smallsh.o
ls
Padre [1006]
Figlio [1008]
input.c input.o makefile note.txt smallsh smallsh.c smallsh.h smallsh.o
[1007] Processo terminato correttamente.
eseguendo una ls in background
stampo id del padre, il processo padre mi chiede un altro comando, e in bakground vedo il figlio che mi stampa il risultato dell ls
il problema è che prima di vedere il 1007 come processo terminato devo per forza lanciare un altro comando e non riesco a capire il perchè.
Riporto la funzione principale
codice:void runcommand(char **cline,int where) /* esegue un comando */ { if(strcmp(*cline,"bp")==0){ printf("BPID=%s\n",getenv("BPID")); return; } pid_t pid; int exitstat,ret; //char *BPIDTmp; //char *PIDTmp=""; char str[100]; pid = fork(); if (pid == (pid_t) -1) { perror("smallsh: fork fallita"); return; } if (pid == (pid_t) 0) { //processo figlio //esegue il comando il cui nome e' il primo elemento di cline, //passando cline come vettore di argomenti printf("Figlio [%d] \n",getpid()); execvp(*cline,cline); perror(*cline); exit(1); } printf("Padre [%d] \n",getpid()); //aggiorno la env BPID //strcat(str, integer_to_string(pid)); //strcat(str, ":"); //setenv("BPID",str,1); // processo padre: avendo messo exec e exit non serve "else" if (where == FOREGROUND) { //ignoro SIGINT su padre sigStruct.sa_handler = SIG_IGN; sigaction(SIGINT, &sigStruct, NULL); //ret = wait(&exitstat); ret = waitpid(pid, &exitstat, 0); if (ret == -1) perror("wait"); //NON CAPISCO if (WIFSIGNALED(exitstat)){ printf("\nProcesso figlio terminato da un segnale non gestito.\n"); } //siabilito SIGINT su padre sigStruct.sa_handler = sigMessage; sigaction(SIGINT, &sigStruct, NULL); }else{ strcat(str, integer_to_string(pid)); strcat(str, ":"); setenv("BPID",str,1); } /* ret = waitpid(pid, &exitstat, 0); printf("[%5d] Processo terminato ", ret); if (WIFEXITED(exitstat)) printf("correttamente.\n"); else if (WIFSIGNALED(exitstat)) printf("forzatamente da un segnale.\n"); */ while ((ret = waitpid(-1, &exitstat, WNOHANG)) > 0) { printf("[%d] Processo terminato ", ret); if (WIFEXITED(exitstat)) printf("correttamente.\n"); else if (WIFSIGNALED(exitstat)) printf("forzatamente da un segnale.\n"); } }

Rispondi quotando