accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Re: sigpending() : fonctionnement différents entre Linux, NetBSD et Solaris ?

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.os.bsd ] 

Retour : Accueil du site fr comp os bsd   charte stats de ce groupe


  Sujet:   Re: sigpending() : fonctionnement différents entre Linux, NetBSD et Solaris ?  
 De: knatsc...@koenigsberg.fr (JKB)
 Groupes: fr.comp.os.unix, fr.comp.os.bsd
 Suivi-à: fr.comp.os.bsd
 Organisation: Nerim -- xDSL Internet Provider
 Date: 15. Apr 2008, 17:57:31
 References: 1
Le 15-04-2008, à propos de
sigpending() : fonctionnement différents entre Linux, NetBSD et Solaris ?,
 JKB écrivait dans fr.comp.os.unix :
> 	Bonjour à tous,
>
> 	Toujours avec mes problèmes de gestions de signaux... Considérons le
> 	bout de code suivant :
>
>     if (sigemptyset(&set) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         return;
>     }
>
>     if (sigaddset(&set, SIGSTART) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         return;
>     }
>
>     /*
>      * Le signal SIGFSTOP doit être traité !
>      */
>
>     if (sigaddset(&set, SIGFSTOP) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         return;
>     }
>
>     if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         return;
>     }
>
> 	...
>
>     (*s_argument_thread).pid = fork();
>
>     if ((*s_argument_thread).pid > 0)
>     {
>         if (pthread_mutex_unlock(&mutex) != 0)
>         {
>             (*s_etat_processus).erreur_systeme = d_es_processus;
>             return;
>         }
> 	...
> 	}
> 	else
> 	{
> 	...
> printf("3> %d\n", getpid());
>         if (sigpending(&set) != 0)
>         {
>             (*s_etat_processus).erreur_systeme = d_es_processus;
>         }
>         else if (sigismember(&set, SIGSTART) == 0)
>         {
> printf("3.1> %d\n", getpid());
>             while(sigismember(&set, SIGSTART) == 0)
>             {
> printf("3.2>\n");
>                 if (sigpending(&set) != 0)
>                 {
>                     (*s_etat_processus).erreur_systeme = d_es_processus;
>                 }
>
>                 nanosleep(&attente, NULL);
>             }
>         }
> printf("4>\n");
> 	...
> 	}
>
> printf("P1> %d\n", (*s_argument_thread).pid);
>     if (kill((*s_argument_thread).pid, SIGSTART) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         pthread_mutex_unlock(&mutex);
>         return;
>     }
> printf("P2>\n");
>
>     if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
>     {
>         (*s_etat_processus).erreur_systeme = d_es_processus;
>         pthread_mutex_unlock(&mutex);
>         return;
>     }
>
>     sigpending(&set);
> printf("P3>\n");
>
> 	Ça a l'air un peu compliqué comme ça... En fait, c'est assez simple.
> 	Pour synchroniser le processus fils avec le processus père, j'envoie
> 	un signal SIGSTART (en fait SIGUSR2) vers le processus fils qui
> 	boucle sur un sigpending (le signal SIGSTART a été bloqué au
> 	préalable).
>
> 	Problème : sous Linux et Solaris, ça fonctionne parfaitement.
> 	Sous NetBSD 4.0, le signal SIGSTART est bien envoyé au processus
> 	fils (avec le bon PID, j'ai vérifié), kill() renvoie 0 donc ça se
> 	passe bien. Mais le sigpending ne voit rien passer :
>
> 1>
> 2>
> 3> 1703
> 3.1> 1703
> 3.2>
> 3.2>
> P1> 1703
> P2>
> P3>
> 3.2>
> P1> 19399
> P2>
> P3>
> 3.2>
> 3.2>
> 3.2>
> 3.2>
> 3.2>
> ...
>
> 	Pourtant, si j'en crois la page man du BSD en question :
>
>      The sigpending function returns a mask of the signals pending for deliv-
>      ery to the calling process in the location indicated by set.  Signals may
>      be pending because they are currently masked, or they are in transition
>      before delivery (although the latter case is not normally detectable).
>
> 	Donc si le signal est bloqué, il doit bien finir par arriver dans la
> 	queue en question.
>
> 	Bug de NetBSD ou ai-je raté quelque chose ?

	Bon, je viens de googliser encore un peu. Visiblement sous NetBSD
	3.1, la fonction renvoie toujours 0. Pratique. Je n'ai pas trouvé
	d'information concernant NetBSD 4.0. Ce qui est bizarre, c'est que
	je ne trouve aucune mention de fonction sigpending dans la libc,
	sauf en compat (en assembleur, et là, je sèche un peu).

	JKB (en arch sparc)

PS : XP et fu2

-- 
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


DateSujet  Auteur
01.01.
o 
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)