OVH Cloud OVH Cloud

Threads + Signal

5 réponses
Avatar
DomiPi
Bonjour,

Je travaille sous Unix (qnx6) compilateur gcc.
J'ai un programme composé de 2 threads.
Si j'envoies un signal du type SIGQUIT vers le programme,
(sous qnx la commande est: slay -s SIGQUIT monprogramme)
le 1er thread de base (père) reçoit bien ce signal et je le contrôle avec
signal(SIGQUIT,mafonction);
Que se passe-t-il à ce moment au niveau du 2d thread ?
Reçoit-il aussi le signal et comment le contrôler?
Merci à tous

Dominique

5 réponses

Avatar
Marc Boyer
DomiPi wrote:
Je travaille sous Unix (qnx6) compilateur gcc.
J'ai un programme composé de 2 threads.
Si j'envoies un signal du type SIGQUIT vers le programme,
(sous qnx la commande est: slay -s SIGQUIT monprogramme)
le 1er thread de base (père) reçoit bien ce signal et je le contrôle avec
signal(SIGQUIT,mafonction);
Que se passe-t-il à ce moment au niveau du 2d thread ?
Reçoit-il aussi le signal et comment le contrôler?


Je réponds de mémoire, si quelqu'un veut préciser des choses
ou me contredire, qu'il n'hésite pas.

A ma connaissance, un signal est intercepté par *un* thread,
et ce thread est indeterminé. Pour spécifier le thread cible,
l'API thread posix propose un truc du genre pthread_signal,
ou un truc du genre. On peut aussi spécifier un masque par
thread, et moi je programmais en dédiant un thread à la
gestion des signaux, et en masquant les autres.

Pour plus de détail, il faut attendre que quelqu'un me
contredise, ou que tu lises la doc de ton OS.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
DomiPi
C'est une bonne idée de dédier le traitement des signaux à un seul thread:
dans mon cas par exemple le thread de base(père). C'est ce que je fait
actuellement pour terminer "proprement" son travail qnand il reçoit un
SIGQUIT.
Dans ce cas je voudrais que le thread père puisse prévenir le fils (car j'en
ai qu'un) pour qu'il termine aussi "proprement" son travail.
Mais comment faire, là je cale ...
Merci
Dominique



"Marc Boyer" a écrit dans le message
de news:boaev5$3pc$
DomiPi wrote:
Je travaille sous Unix (qnx6) compilateur gcc.
J'ai un programme composé de 2 threads.
Si j'envoies un signal du type SIGQUIT vers le programme,
(sous qnx la commande est: slay -s SIGQUIT monprogramme)
le 1er thread de base (père) reçoit bien ce signal et je le contrôle
avec


signal(SIGQUIT,mafonction);
Que se passe-t-il à ce moment au niveau du 2d thread ?
Reçoit-il aussi le signal et comment le contrôler?


Je réponds de mémoire, si quelqu'un veut préciser des choses
ou me contredire, qu'il n'hésite pas.

A ma connaissance, un signal est intercepté par *un* thread,
et ce thread est indeterminé. Pour spécifier le thread cible,
l'API thread posix propose un truc du genre pthread_signal,
ou un truc du genre. On peut aussi spécifier un masque par
thread, et moi je programmais en dédiant un thread à la
gestion des signaux, et en masquant les autres.

Pour plus de détail, il faut attendre que quelqu'un me
contredise, ou que tu lises la doc de ton OS.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(



Avatar
Marc Boyer
DomiPi wrote:
C'est une bonne idée de dédier le traitement des signaux à un seul thread:
dans mon cas par exemple le thread de base(père). C'est ce que je fait
actuellement pour terminer "proprement" son travail qnand il reçoit un
SIGQUIT.
Dans ce cas je voudrais que le thread père puisse prévenir le fils (car j'en
ai qu'un) pour qu'il termine aussi "proprement" son travail.
Mais comment faire, là je cale ...


man pthread_kill

Ton thread père envois des signaux de terminaison aux fils.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Laurent Wacrenier
DomiPi écrit:
C'est une bonne idée de dédier le traitement des signaux à un seul thread:
dans mon cas par exemple le thread de base(père). C'est ce que je fait
actuellement pour terminer "proprement" son travail qnand il reçoit un
SIGQUIT.


Changer le masque des signaux reçus avec pthread_sigmask. Pour bien
faire, si tu veux que le père intercepte les signaux, lance un
pthread_sigmask sur le père, fait ton pthread_create puis remet le
masque de signaux sur le père à sa valeur originelle.

Dans ce cas je voudrais que le thread père puisse prévenir le fils (car j'en
ai qu'un) pour qu'il termine aussi "proprement" son travail.


Lui envoyer un pthread_cancel()

Avatar
Erwann ABALEA
On Wed, 5 Nov 2003, DomiPi wrote:

C'est une bonne idée de dédier le traitement des signaux à un seul thread:
dans mon cas par exemple le thread de base(père). C'est ce que je fait
actuellement pour terminer "proprement" son travail qnand il reçoit un
SIGQUIT.
Dans ce cas je voudrais que le thread père puisse prévenir le fils (car j'en
ai qu'un) pour qu'il termine aussi "proprement" son travail.
Mais comment faire, là je cale ...


Ah ben c'est une autre question... C'est un problème de communication
entre threads.

Personnellement, je verrais ça comme ça:
- le père (ou autre, celui qui reçoit les signaux) reçoit donc un
signal, lui disant de se casser
- il lève un drapeau, dédié à cet usage
- les fils (ou les autres threads, puisqu'il n'y a pas de notion
père/fils) surveillent le drapeau de temps en temps, et agissent en
conséquence

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
70% de frjv sont des newbies ? Et une fois qu'ils ne le sont plus que
font-ils ? Ils quittent frjv parce que c'est trop à chier ? Parce que
s'ils y restent et gardent leur comportement, ça devient des neuneux.
-+- XB in: Guide du Neuneu d'Usenet - Tu seras un neuneu mon fils -+-