D3stroyer
14-07-2007, 19:53
salve a tutti, per voi sarà un giochetto analizzare questo codice e spiegarmi perchè emette questo output ed è proprio il perchè che non capisco.
ecco il codice:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* variabile globale contatore dei segnali SIGUSR1
ricevuti da ciascun processo */
int ntimes = 0;
void catcher(int signo)
{
printf("Processo %d ha ricevuto un segnale #%d volte \n’’, getpid(), ++ntimes);
}
int main()
{
int pid, ppid;
signal(SIGUSR1, catcher); /* il figlio eredita questa gestione del segnale SIGUSR1 */
if ((pid=fork()) < 0)
{
perror("fork error");
exit(1);
}
else if (pid == 0)
{
ppid = getppid();
for (;;)
{
printf("figlio: mio padre e’ %d\n", ppid);
sleep(1);
kill(ppid, SIGUSR1);
pause();
}
}
else
{
for (;;)
{
printf("padre: mio figlio e’ %d\n", pid);
pause();
sleep(1);
kill(pid, SIGUSR1);
}
}
}
L'output è di questo tipo:
http://img103.imageshack.us/img103/1417/esepp8.jpg
e così continua il loop.
Non ho capito:
1) perchè nell'output dopo il primo figlio:, padre: e processo xxx ricevuto ... non c'è un altro processo xxxx ricevuto ma un padre:
2)penso di aver capito come funziona lo sleep qui..ma secondo il mio ragionamento il pause ha una reazione sbagliata quindi non riesco a unire i puntini e a capire.
3) perchè il numero ntimes non aumenta ad ogni riga in output???
grazie :)
ecco il codice:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* variabile globale contatore dei segnali SIGUSR1
ricevuti da ciascun processo */
int ntimes = 0;
void catcher(int signo)
{
printf("Processo %d ha ricevuto un segnale #%d volte \n’’, getpid(), ++ntimes);
}
int main()
{
int pid, ppid;
signal(SIGUSR1, catcher); /* il figlio eredita questa gestione del segnale SIGUSR1 */
if ((pid=fork()) < 0)
{
perror("fork error");
exit(1);
}
else if (pid == 0)
{
ppid = getppid();
for (;;)
{
printf("figlio: mio padre e’ %d\n", ppid);
sleep(1);
kill(ppid, SIGUSR1);
pause();
}
}
else
{
for (;;)
{
printf("padre: mio figlio e’ %d\n", pid);
pause();
sleep(1);
kill(pid, SIGUSR1);
}
}
}
L'output è di questo tipo:
http://img103.imageshack.us/img103/1417/esepp8.jpg
e così continua il loop.
Non ho capito:
1) perchè nell'output dopo il primo figlio:, padre: e processo xxx ricevuto ... non c'è un altro processo xxxx ricevuto ma un padre:
2)penso di aver capito come funziona lo sleep qui..ma secondo il mio ragionamento il pause ha una reazione sbagliata quindi non riesco a unire i puntini e a capire.
3) perchè il numero ntimes non aumenta ad ogni riga in output???
grazie :)