PDA

Visualizza la versione completa : Problema programma C gestione processi in Linux


zabuza88
12-07-2011, 11:58
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??



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

}

valia
13-07-2011, 09:11
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

zabuza88
13-07-2011, 11:34
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..

valia
13-07-2011, 11:49
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?

zabuza88
13-07-2011, 11:55
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..

valia
13-07-2011, 12:04
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)

zabuza88
13-07-2011, 12:38
Ok grazie mille per l'aiuto :D ..Forse il caso che mi metta io a debugg :bh: ...

zabuza88
13-07-2011, 14:18
:fighet:
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!


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


}

Loading