Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] fork

  1. #1

    [C] fork

    ciao,

    come si fa a terminare un processo figlio?

  2. #2
    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.

  3. #3
    è 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)?

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.

  5. #5
    attende che terminano e se non terminano entro 5 secondi
    come calcoli il tempo di attesa?

  6. #6
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    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

  7. #7
    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);

  8. #8
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    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);
    Prova così



    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

  9. #9
    grazie tante... a proposito

    questa parte

    codice:
    strcpy(buffer, "\0");
    dovrebbe ripulire il buffer (dichiarato come char buffer[1000]) dopo che il figlio ha terminato. E' inutile? Necessaria? si può fare meglio?


    grazie ancora

  10. #10
    credo che sia inutile.
    nel caso invece risulti essere utile ti può bastare un
    codice:
    *buffer = 0;
    scrivi solo un char invece di due: un grande guadagno di efficienza
    @_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.