Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797

    [C] fork, pid non rimangono nell vettore

    questo il codice (molte cose stamapte servono per il debug)

    il porgramma deve creare N figli e farli attendere alemno 10 secondi. se il padre viene interrotto (ctrl+c) deve uccidere anche i figli..

    codice:
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    #include <stdlib.h>
    
    int n=0;
    int f[100];
    
    void stoppa(){ //funzione che uccide i figli
    int k;
    	printf("kill \n");
     for(k=0;k<n;k++){
      printf("Termino FORZATAMENTE figlio: %d (pid: %d)\n",k+1,f[k]);
     // kill(f[k],SIGTERM);
      }
    }
    
    int main()
    {
     int rc,i,k;
     printf("Figli? \n");
     scanf ("%d",&n);
      printf("il processo %d crea %d figli\n",getpid(),n);
    	for(i=0;i<n;i++){
    		if((rc=fork())<0) { //crea tutti i figli, se c sono errori esci
    		 printf("Errore creazione processi");	
    		 exit(-1);
    		 } 
    		if (rc==0){// se è un figlio
    			f[i]=getpid(); //prendi il pid e mettilo nel vettore
    			printf("Inizio figlio: %d (pid: %d)\n",i+1,f[i]);
    			
    			printf("%d \n",f[i]);
    			sleep(10); //aspetta
    			printf("Termino figlio: %d (pid: %d)\n",i+1,f[i]); //quando termina esce
    			exit(0);
    		  } 
    	} signal(SIGINT,stoppa);  sleep(10); // il programma attende 10 secondi e poi esce
     for(k=0;k<n;k++)  printf("figlio: %d (pid: %d)\n",k+1,f[k]); //debug
     	
    }
    stefano@ubuntu:~/SO$ ./a.out
    Figli?
    5
    il processo 9483 crea 5 figli
    Inizio figlio: 1 (pid: 9484)
    9484
    Inizio figlio: 2 (pid: 9485)
    9485
    Inizio figlio: 3 (pid: 9486)
    9486
    Inizio figlio: 4 (pid: 9487)
    9487
    Inizio figlio: 5 (pid: 9488)
    9488
    kill
    Termino FORZATAMENTE figlio: 1 (pid: 0)
    Termino FORZATAMENTE figlio: 2 (pid: 0)
    Termino FORZATAMENTE figlio: 3 (pid: 0)
    Termino FORZATAMENTE figlio: 4 (pid: 0)
    Termino FORZATAMENTE figlio: 5 (pid: 0)
    figlio: 1 (pid: 0)
    figlio: 2 (pid: 0)
    figlio: 3 (pid: 0)
    figlio: 4 (pid: 0)
    figlio: 5 (pid: 0)


    il problema è che in esecuzione nn tiene i pid nell'vettore

  2. #2
    non so se può aiutarti ma una causa potrebbe essere il fatto che te crei f come array di int, ma allora dovresti farci un casting. Infatti la getpid non torna proprio un int ma un pid_t che se non sbaglio equivale a un unsigned int.
    Prova e facci sapere
    Open your mind. Use Open Source.

  3. #3
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    ho sistemato mettendo l'assegnazione nell'else e non nell'if


    codice:
                    if (rc==0){// se è un figlio
                            printf("Inizio figlio: %d (pid: %d)\n",i+1,getpid());
                            sleep(10); //aspetta
                            printf("Termino figlio: %d (pid: %d)\n",i+1,getpid()); //quando termina esce
                            exit(0);
                      }
                    else f[i]=rc; //prendi il pid e mettilo nel vettore

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.