Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

#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