#1 Le 08/12/2008, à 22:38
- Seb03
Signaux en c (parametrage d'Ubuntu)
J'ai un problème à l'execution de deux programmes c. (un père et son fils)
quand j'envoie un signal d'un programme à l'autre (SIGUSR1), ça me met le message
Signal#1: defini par l'usager
mais ça ne répond pas dans l'autre programme alors que sur les PCs de mon école le programme marche.
Y a t'il une manip spéciale à faire pour pouvoir travailler sur ce genre de choses?
#2 Le 08/12/2008, à 22:46
- nicolas.sitbon
Re : Signaux en c (parametrage d'Ubuntu)
Peut on voir le code?
Hors ligne
#3 Le 09/12/2008, à 08:46
- Seb03
Re : Signaux en c (parametrage d'Ubuntu)
Voilà un programme que j'avais écrit spécifiquement pour tester le fonctionnement des signaux sur mon ordi (ce programme marche sur les ordis de mon école)
Programme mère:
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/ipc.h> /*inter process communications (clés)*/
#include<sys/msg.h> /*files de messages*/
#include<sys/shm.h> /*Segments de memoire*/
#include<sys/sem.h> /*Semaphores*/
int main(void)
{
int pid;
pid=fork();
if(pid==0)
{
execv("B",NULL);
}
kill(getpid(),SIGUSR1);
wait(NULL);
exit(0);
}
Programme fille:
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/ipc.h> /*inter process communications (clés)*/
#include<sys/msg.h> /*files de messages*/
#include<sys/shm.h> /*Segments de memoire*/
#include<sys/sem.h> /*Semaphores*/
void fonc(int sig);
int main(void)
{
signal(SIGUSR1,fonc);
wait(NULL);
exit(0);
}
void fonc(int sig)
{
printf("signal 1 reçu!!\n");
}
Je précise que ce programme ne sert absolument à rien sinon à me faire réviser mes cours de c système en vue de mon exam de mercredi
#4 Le 09/12/2008, à 10:11
- nicolas.sitbon
Re : Signaux en c (parametrage d'Ubuntu)
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void)
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork");
}
else if(pid == 0)
{
execv("B", NULL);
}
else
{
kill(pid, SIGUSR1);
wait(NULL);
}
return 0;
}
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
static void fonc(int signum)
{
(void) signum;
puts("signal 1 reçu!!");
}
int main(void)
{
signal(SIGUSR1, fonc);
pause();
return 0;
}
Hors ligne
#5 Le 09/12/2008, à 10:45
- Seb03
Re : Signaux en c (parametrage d'Ubuntu)
OK merci ça marche!!
En fait en gros (si on enlève le fait que ton programme est bien plus propre que le mien), le problème semble venir du wait(NULL) dans la fille que tu as remplacé par un pause().
Merci beaucoup! Je vais retravailler ça
#6 Le 09/12/2008, à 11:21
- nicolas.sitbon
Re : Signaux en c (parametrage d'Ubuntu)
Le problème vient surtout de là :
kill(pid, SIGUSR1);
avant, le père s'envoyait le signal à lui même et comme il ne le gérait pas, il se terminait. Maintenant, le père envoit bien le signal à son fils qui lui le gère "correctement", et attend la terminaison de son fils.
Hors ligne
#7 Le 09/12/2008, à 13:38
- Seb03
Re : Signaux en c (parametrage d'Ubuntu)
Ah oui je suis stupide!
J'ai tapé tous mes programmes en faisant comme si getpid() me renvoyait le pid du fils. Tu m'évites de gros ennuis pour demain.
Merci
RESOLU