2010-01-27 5 views
1

je l'ai fait ce qui suit:Linux Virtual Comportement Timer sur Threads Clone

  1. Créer une horloge virtuelle qui déclenche de façon répétée.
  2. Installer gestionnaire de signal pour sigvtalrm
  3. clone d'appel syscall
  4. Set sched_affinity tels que le fil cloné fonctionne sur un autre CPU

Est-ce que le fil cloné écoutera aussi pour sigvtalrm? Alors, les deux threads appellent-ils le gestionnaire de signaux quand SIGVTALRM est déclenché? Aussi, après avoir créé le nouveau thread, puis-je changer son gestionnaire de signaux pour SIGVTALRM à une autre fonction sans affecter le gestionnaire de signaux threads principal?

Je suppose que cela dépend des indicateurs passés à clone(). Principalement, j'utilise CLONE_SIGHAND et SIGCHLD. Cela dépend-il d'autres drapeaux?

+0

Cela dépend également du drapeau 'CLONE_THREAD'. – caf

Répondre

1

Cela dépend entièrement si vous spécifiez CLONE_THREAD au clone syscall. Si vous faites et non, alors l'itimer n'est pas hérité par l'enfant (il ne sera donc pas signalé lorsque le temporisateur expire). Il aura toujours un gestionnaire de signal installé.

Si vous faites spécifier CLONE_THREAD, l'enfant est considéré comme appartenant au même processus que le parent. Lorsque le temporisateur expire, un des threads seront signalés (et exécuter le gestionnaire de signal) - mais il n'est pas spécifié lequel. Que se passe-t-il si, lorsque vous essayez de modifier le gestionnaire de signal de l'enfant, cela dépend du drapeau CLONE_SIGHAND. Si ce n'est pas le cas, l'enfant peut appeler joyeusement sigaction pour changer le gestionnaire de signal sans affecter le parent; mais si CLONE_SIGHAND est défini, alors lorsque l'enfant appelle sigaction, le gestionnaire de signal est modifié pour l'ensemble du processus. Notez également que si vous spécifiez CLONE_THREAD, vous devez également spécifier CLONE_SIGHAND.

L'enfant peut cependant utiliser sigprocmask pour masquer le signal SIGVTALRM, sans affecter le parent.