Salut,
Tiens, ça compile pas.

Tiens ça compile si je vire -Wall -ansi -pedantic

Erf...

Comment dire...
Pour capter un signal, il faut dire à Linux : "Hé garçon, quand mon appli reçoit ce signal, merci d'appeler cette fonction !".
Pour demander ça à Linux, il faut utiliser la fonction
signal.
Dans une invite, tape man 2 signal ou man 2 kill pour plus d'info.
Voilà ce que ça me donne, à condition que j'ai compris l'énoncé...
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int p1; // Pid du fils 1
int p2; // Pid du fils 2
int fils_courant = 2; // Dernier fils à qui ont a envoyé le signal
int counter = 10; // Passe à 0 quand il faut arrêter le programme
void pere_signal_handler(int a)
{
counter -= 1;
sleep(2);
if (fils_courant == 2)
{
printf("Le pere envoie le signal au fils 1\n");
kill(p1, SIGUSR1);
fils_courant = 1;
}
else
{
printf("Le pere envoie le signal au fils 2\n");
kill(p2, SIGUSR1);
fils_courant = 2;
}
}
void fils_signal_handler(int a)
{
printf("Le fils %d renvoie le signal au pere\n", getpid());
kill(getppid(), SIGUSR1);
}
int main()
{
printf("le pere est %d\n", getpid());
// Mise en place du handler du père
signal(SIGUSR1, pere_signal_handler);
p1=fork();
if(p1<0) { perror("fork"); exit(1); }
if(p1==0)
{
printf("le fils 1 est %d\n", getpid());
signal(SIGUSR1, fils_signal_handler);
while (1);
}
p2=fork();
if(p2<0) { perror("fork"); exit(1); }
if(p2==0)
{
printf("le fils 2 est %d\n", getpid());
signal(SIGUSR1, fils_signal_handler);
while (1);
}
// On force le premier envoie
pere_signal_handler(0);
while (counter);
kill(p1, SIGKILL);
kill(p2, SIGKILL);
return 0;
}