problemi con segnali tra processi [C]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
neofitabo
Prode Principiante
Messaggi: 6
Iscrizione: sabato 4 febbraio 2017, 10:41
Sesso: Maschile

problemi con segnali tra processi [C]

Messaggio da neofitabo »

Salve ho un problema con un programma. La richiesta è quella di creare due processi figlio e poi ognuno di essi, utilizzando una exec deve, mandare un segnale di tipo SIGUSR1 al padre. Il problema è che il padre non riceve il messaggio e quindi non scatta l' handler. Vi posto i due programmi, grazie in anticipo.

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void hand(int par);

int main()
{
	pid_t pid1,pid2;
	
	pid1=fork();
	char str[5];
	char str2[5];
	char str3[5];
	
	sprintf(str3,"%d",getpid());
	
	if(pid1==0) //figlio 1
	{
		
		sprintf(str,"%d",getpid());
		execl("EX2",&str,&str3,NULL);
	}
	
	else //padre
	{
		pid2=fork();
		
		if(pid2==0) //figlio 2
		{
			
			sleep(1);
			sprintf(str2,"%d",getpid());
			execl("EX2",&str2,&str3,NULL);
			
		}
		else //padre 
		{
			
			printf("sono qui\n");
			signal(SIGUSR1,hand);
			pause();
			printf("ma qui no\n");
			
			
		}
	}
}

void hand(int par)
{
	int i=1;
	if(par==SIGUSR1)
	{
		printf("(%d) ho ricevuto il segnale SIGUSR1",i);
		i++;
	}
}
Questo è il codice per di EX2:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h> //serve per pid_t
#include <signal.h>
int main(int argc, char *argv[])
{
	
	pid_t processo=atoi(argv[0]);
	pid_t padre=(argv[1]);
	
	sleep(3);
	kill(padre,SIGUSR1);
	printf("sono il processo %d e sto mandando il segnale SIGUSR1\n",processo);
	
	
	
}

neofitabo
Prode Principiante
Messaggi: 6
Iscrizione: sabato 4 febbraio 2017, 10:41
Sesso: Maschile

Re: problemi con segnali tra processi [C]

Messaggio da neofitabo »

Scusate avevo dimenticato di usare atoi nel secondo programma per la variabile padre, comunque ho corretto eventuali problemi e il codice sembra funzionare. Posto i due codici "corretti":

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void hand(int par);

int main()
{
	pid_t pid1,pid2;
	
	pid1=fork();
	char str[5];
	char str2[5];
	char str3[5];
	
	sprintf(str3,"%d",getpid());
	
	if(pid1==0) //figlio 1
	{
		
		sprintf(str,"%d",getpid());
		execl("EX2",&str,&str3,NULL);
	}
	
	else //padre
	{
		pid2=fork();
		
		if(pid2==0) //figlio 2
		{
			
			sleep(1);
			sprintf(str2,"%d",getpid());
			execl("EX2",&str2,&str3,NULL);
			
		}
		else //padre 
		{
			
			printf("sono qui\n");
			signal(SIGUSR1,hand);
			pause();
			signal(SIGUSR1,hand);
			
			
			waitpid(pid1,NULL,0);
			waitpid(pid2,NULL,0);
			
			
		}
	}
}

void hand(int par)
{
	int i=1;
	if(par==SIGUSR1)
	{
		if(i==1)
		printf("(%d) ho ricevuto il segnale SIGUSR1\n",i);
		sleep(2);
		i++;
		if(i>1)
		{
			printf("(%d) ho ricevuto il segnale SIGUSR1\n",i);
		}
	}
}
[code]

EX2 :

[code]
#include <stdio.h>
#include <stdlib.h> //serve per pid_t
#include <signal.h>
int main(int argc, char *argv[])
{
	
	pid_t processo=atoi(argv[0]);
	pid_t padre=atoi(argv[1]);
	
	printf("sono il processo %d e sto mandando il segnale SIGUSR1\n",processo);
	kill(padre,SIGUSR1);

}


Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti