Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema programma C gestione processi in Linux

    ciao a tutti.Spero che tra di voi ci sia qualcuno che mi possa aiutare.COmunque lo scopo di questo programma è quello di creare una sorta di ruba bandiera tra i processi.Si creano 2 squadre di processi con un numero di processi passato per argomento e poi vengono creati dal padre.
    Successivamente il padre invia la SIGUSR1 a tutti i processi ma solo quelli interessati devono riicevere il msg(esempio 2 squadre da 3 processi,se chiamata=0 vengono chiamati 0 e 3)
    SI esegue il test della squadra e chi vince prende il punto.Il problema è che il programma che ho scritto ,dopo la kill,termina...Suggerimenti??

    codice:
    #include <signal.h>
    #include <time.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    void ricezionemsg(int signo);
    int punt1=0;
    int punt2=0;
    int flag=0;
    
    int N;
    int processo;
    
    int chiamata;
    
    
    
    
    int main(int argc,char * argv[]){
    
    N=atoi(argv[1]);
    //printf("tutto ok %d \n ",N);
    int i;
    int pid;
    for(i=0;i<N*2;i++){
    pid=fork();
    //if(pid>0)printf("ciao sono il padre");
    if(pid==0){
    signal(SIGUSR1,ricezionemsg);
    processo=i;
    printf("Io sono il processo con pid %d e numero %d con valore del pid %d \n",getpid(),processo,pid);
    pause();
    }
    }
    int gruppo;
    srand(time(NULL));
    if(pid>0){
    sleep(5);
    //gruppo=getpgid(0);
    chiamata=rand()%(N);
    printf("rand %d ",chiamata);
    kill(0, SIGUSR1);
    wait(NULL);
    printf("il punteggio di 1 è %d il punteggio di 2 è %d \n",punt1,punt2);
    }
    
    
    }
    
    
    
    void ricezionemsg(int signo){
    
    if(processo!=chiamata|processo!=(chiamata+N))exit(0);
    if(flag==0){
    flag=1;
    if(processo>N)punt2++;
    else punt1++;
    printf("funziona");
    exit(2);
    }
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ho l'impressione che tu killi il processo padre

    kill(0, SIGUSR1);

    kill dovrebbe prendere due parametri, il primo è appunto il PID del processo che vuoi killare e l'unico punto in cui vedo kill ha come pid 0

  3. #3
    kill(pid,segnale);
    Dovrebbe essere..Se il pid è =0 il segnale viene mandato a tutti i processi dello stesso gruppo(i figli di un processo fanno parte dello stesso gruppo);
    Ora il problema è che ,anche se fosse, io non invio una SIGKILL ma una SIGUSR1 che dal padre non è gestita mentre dai figli si...
    Correggetemi se sbaglio..

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non sono espertissima, ma visto che la teoria ci dice

    If pid is 0, sig shall be sent to all processes (excluding an unspecified set of system processes) whose process group ID is equal to the process group ID of the sender, and for which the process has permission to send a signal.

    resta il segnale che usi, ma il padre non le gestisce, mentre i figli fanno qualche exit. Sicuro che non sono quelle il problema?

  5. #5
    Intanto ti ringrazio per le risposte..Gentilissima..
    Comunque non credo che le exit dei figli possano arrecare problemi,visto che così escono dalla funzione e terminano...Il fatto che non mi riesco a spiegare è perchè il padre non visualizza l'ultima printf..

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Su exit è interessante questo:

    Note on exit() vs _exit(): The C library function exit() calls the kernel system call _exit() internally. The kernel system call _exit() will cause the kernel to close descriptors, free memory, and perform the kernel terminating process clean-up. The C library function exit() call will flush I/O buffers and perform aditional clean-up before calling _exit() internally. The function exit(status) causes the executable to return "status" as the return code for main(). When exit(status) is called by a child process, it allows the parent process to examine the terminating status of the child (if it terminates first). Without this call (or a call from main() to return()) and specifying the status argument, the process will not return a value.

    secondo me il tuo programma finisce prima che tu possa gestire il tutto (altro non so che dire a meno di mettermi a debuggare)

  7. #7
    Ok grazie mille per l'aiuto ..Forse è il caso che mi metta io a debugg ...

  8. #8

    Risolto!!


    Ho risolto il problema con le pipe!
    Ora il giochetto tra processi funziona..funziona tutto!
    Posto il codice nel caso possa servire a qualcuno!DI nuovo grazie Valia per il supporto!

    codice:
    #include <signal.h>
    #include <ctype.h>
    #include <time.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    
    int punt1=0;
    int punt2=0;
    int flag=0;
    int pipe1[2],pipe2[2];
    
    int N;
    int processo;
    void padre(void);
    int pid;
    int chiamata=0;
    
    int ricevere(int processon){
    
    int chiamat;
     sleep(2);
    
    
    read(pipe1[0],&chiamat,sizeof(int));
    
    if(processon==chiamat|processon==(chiamat+N)){
    printf("ciao sono il processo %d \n",processon);
    write(pipe2[1],&processon,sizeof(int));
    exit(5);
    }
    else exit(0);
    
    }
    
    int npartita=0;
    
    int main(int argc,char * argv[]){
    do{
    npartita++;
    printf("inizio nuova partita numero %d: \n \n",npartita);
    
    
    N=atoi(argv[1]);
    int tabpid[N*2];
    if (pipe(pipe1)<0)
    	{
    		perror("pipe error");
    		exit(-1);
    	}
    if (pipe(pipe2)<0)
    	{
    		perror("pipe error");
    		exit(-1);
    	}
    
    int i;
    
    srand(time(NULL));
    printf( "point \n");
    chiamata=rand()% N;
    for (i=0;i<N*2;i++)
    	{
    	if ((tabpid[i]=fork())<0)
    		{
    		perror("fork error");
    		exit(-1);
    		}
    		pid=tabpid[i];
    		if (pid==0)ricevere(i) ;
    	}
    printf("padre");
    if(pid>0) 
    {
    int gioc;
    for(i=0;i<N*2;i++)
    write(pipe1[1],&chiamata,sizeof(int));
    read(pipe2[0],&gioc,sizeof(int));
    int i;
    sleep(1);
    if(gioc>N)punt2++;
    else punt1++;
    printf("il punteggio di 1 è %d il punteggio di 2 è %d \n",punt1,punt2);
    }
    
    }while(1);
    
    
    }

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.