Salve a tutti!! Apro questa discussione per postare un problema su un algoritmo scritto in C, sostanzialmente (apparte il codice un po pasticciato) l'unico problema che riscontro è che una volta che il processo padre invia il segnale al processo figlio esatto, esso tramite la signal richiama una funzione denominata (molta fantasia) "funzione" in cui dovrebbe fare un execlp dei comandi (contenuti in argv[]) passati dal "main" al "figlio" e dopo a "funzione".
Bene ho provato a fare qualche debug con alcuni printf e che l'exec lo faccia non ci sono dubbi, ma comunque una volta compilato ed eseguito non riscontro nulla inoltre dentro "funzione" la variabile comando sembra essere (null). Forse mi sono dilungato un pò troppo comunque l'intoppo sta lì, ringrazio anticipatamente a chi può aiutarmi di seguito riporto il codice.
codice:
//Si realizzi un comando in ambiente Unix,che, utilizzando le system call del sistema operativo, soddisfi le seguenti specifiche:
//– Sintassi di invocazione:
//prova com1 com2 ..comN
//Significato degli argomenti:
// prova: nome dell eseguibile generato;
// com1, com2, ..comN: nomi di comandi ! (file eseguibili).
//• Comportamento dei processi:
//Il processo iniziale (P0) deve creare N processi figli (P1, P2, .. PN).
//• Comportamento del generico figlio Pi (i=1,..N):
//Il processo figlio Pi , una volta creato, deve porsi in attesa di
//un eventuale attivazione da parte del padre. In caso di attivazione, Pi
//stamperà il proprio PID ed eseguirà il comando com i .
//• Comportamento del padre P0:
//Il processo padre (P0), una volta creati i figli, definirà il proprio
//comportamento in base al valore del proprio pid:
//– se pid è pari, attiverà i figli con pid pari ;
//– se pid è dispari, attiverà i figli con pid dispari;
//Successivamente, dopo aver raccolto e stampato lo stato di terminazione---------------->>(ATTUALMENTE OMESSO LA RACCOLTA DELLO STATO DI TERMINAZIONE)
//di tutti i figli, il padre terminerà la propria esecuzione.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#define max 20
void funzione();
void figlio(char *comando);
char *comando;
main(int argc, char *argv[])
{
char *comando;
int pid[max], i=0, ppid, k;
for(k=0; k<argc; k++)
{
printf("\nARGC= %d ARGV= %s\n",argc, argv[k]);
}
if(argc==1)
{
printf("\nErrore nella sintassi dell'argomento\n\n");
exit(1);
}
else{
ppid=getpid();
for(i=0; i<argc-1; i++)
{
pid[i]=fork();
if(pid[i]==0)
{
figlio(argv[i+1]);
exit(0);
}
else
{
printf("\n\nSono il padre pid:%d figlio creato con pid:%d\n\n", ppid, pid[i]);
}
sleep(1);
}
}
if((ppid%2)==0)
{
for(i=0; i<argc-1; i++)
{
kill(pid[i], SIGUSR1);
}
}
else{
for(i=0; i<argc-1; i++)
kill(pid[i], SIGUSR2);
}
sleep(5);
}
void funzione()
{
//printf("\n\n%s\n\n", comando);
printf("\n\nsono il figlio: %d sono stato attivato!!\n\n", getpid());
execlp(comando,comando,(char *)0);
}
void figlio(char *comando)
{
int pidfiglio;
pidfiglio=getpid();
if((pidfiglio%2)==0)
{
//printf("\n\n\n%s\n\n\n", comando);
printf("\nImposto il segnale..\n");
signal(SIGUSR1, funzione);
}
else{
printf("\nImposto il segnale...");
signal(SIGUSR2, funzione);
}
while(1);
}