ciao,
come si fa a terminare un processo figlio?
ciao,
come si fa a terminare un processo figlio?
Killando il processo.
Registri il pid da qualche parte e poi
#include <signal.h>
kill(pid, SIGTERM)
Primo argomento il pid, secondo argomento il segnale.
è sempre necessario killare un processo? oppure quando questo è termina il suo la voro si suicida (nel senso ch ela memoria ad esso allocata viene liberata automaticamente)?
io ho un programma che genera processi e attende che terminano e se non terminano entro 5 secondi li killa, quindi direi che non e affatto necessario killarli.
come calcoli il tempo di attesa?attende che terminano e se non terminano entro 5 secondi
Basta che ad un processo fai chiamare la exit()...
In questo modo solo quel processo termina, e non tutti gli altri...
Ovviamente puoi anche inviargli un kill, term o end signal... Se non li gestisce muore...
E' utile mettere dei controlli che killino i figli dopo un po' di secondi per evitare qualche problema: se ad esempio il figlio e' in attesa di una risposta da una socket, ma questa risposta non arriva (ad esempio l'interlocutore e' terminato), il figlio rimarrebbe in eterno li' ad aspettare, otterresti in poche parole un processo zombie che pero' occupa risorse e non puo' venire rilevato...
Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00
mi date un parere spassionato su questo frammento di codice? dov'è che è proprio da buttare?
codice:listen(sockfd, 5); clilen = sizeof(cli_addr); do { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("errore"); n = read(newsockfd, buffer, 1000); if (n < 0) error("errore"); pid = fork(); if (pid < 0) { printf("Cannot fork!!\n"); exit(1); } if (pid == 0) { strcpy(headers, H1); strcat(headers, H2); strcat(headers, H3); strcat(headers, H4); strcat(headers, H5); strcat(headers, H6); n = write(newsockfd, headers, strlen(headers)); n = write(newsockfd, "ciao ciao", 9); if (n < 0) printf("errrrrror"); strcpy(buffer, "\0"); close(newsockfd); } else { close(newsockfd); } } while(1);
Prova cosìOriginariamente inviato da matteolandi
mi date un parere spassionato su questo frammento di codice? dov'è che è proprio da buttare?
codice:listen(sockfd, 5); clilen = sizeof(cli_addr); do { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("errore"); n = read(newsockfd, buffer, 1000); if (n < 0) error("errore"); pid = fork(); if (pid < 0) { printf("Cannot fork!!\n"); exit(1); } if (pid == 0) { strcpy(headers, H1); strcat(headers, H2); strcat(headers, H3); strcat(headers, H4); strcat(headers, H5); strcat(headers, H6); n = write(newsockfd, headers, strlen(headers)); n = write(newsockfd, "ciao ciao", 9); if (n < 0) printf("errrrrror"); strcpy(buffer, "\0"); close(newsockfd); exit(0); } else { close(newsockfd); } } while(1);
PS: Perche' da buttare ho guardato solo di far uscire il processo figlio dopo che ha eseguito la connessione... Non ho guardato se ci sono altri problemi...
Se il processo figlio non uscisse anche lui ripeterebbe il ciclo così solo uno dei due processi riuscirebbe a fare l'accept, mentre all'altro l'accept ritornerebbe subito un errore e non so cos'accadrebbe dopo
Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00
grazie tante... a proposito
questa parte
dovrebbe ripulire il buffer (dichiarato come char buffer[1000]) dopo che il figlio ha terminato. E' inutile? Necessaria? si può fare meglio?codice:strcpy(buffer, "\0");
grazie ancora
credo che sia inutile.
nel caso invece risulti essere utile ti può bastare un
scrivi solo un char invece di due: un grande guadagno di efficienzacodice:*buffer = 0;
@_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_