2013-02-13 2 views
8

Ein Prozess hat einen 'Gabel'-Aufruf, nachdem ein Signal-Handler [für SIGINT] registriert wurde. Was passiert, wenn SIGINT über die Befehlszeile gesendet wird? ob Elternteil oder Kind oder beides verlassen wird? Eltern und Kind laufen beide in unendlichen While-Schleifen.Verhalten von Eltern und Kind für einen Signal-Handler

Antwort

12

Wenn Sie fork (ohne weitere exec*) tun, nachdem ein Signal-Handler registriert wurde, wird der gleiche Signal-Handler in den übergeordneten und untergeordneten Prozessen verwendet. Das heißt, wenn Sie etwas anderes als 10 in Ihrem SIGINT Handler tun, wird weder Eltern noch Kind beenden (wie SIGINT wurde hier irrelevant).

Wenn Sie ein SIGINT bedeuten vom Terminal gesendet (von vintr Zeichen, das in der Regel ist Ctrl+C): es wird durch Verfahren erhalten werden, unter Verwendung des Terminal als Terminal zu steuern. Das heißt, wenn Sie Kind oder Eltern nicht vom steuernden Terminal trennen, reagieren beide auf Ctrl+C, indem Sie Ihren SIGINT-Handler aufrufen.

+0

Aber der Signalhandler ist vor fork() registriert, also sollte das Kind die Kopie nicht haben. Nach fork() sollte das Kind die Anweisungen ausführen, die auf fork() folgen. Die Registrierung des Signal-Handlers erfolgt nur im übergeordneten Objekt. – Puneet

+4

@Puneet Es * wird * vom Kind geerbt, was immer du denkst, wie es * sein * sollte. Siehe 'Mannsigaction'. Was ist daran so seltsam? Datei-Deskriptoren, die vor 'fork' geöffnet wurden, werden ebenfalls übernommen. Das Besondere an Signalen ist, dass nicht-standardmäßige, nicht-ignorierende * Handler * auf 'execve' & friends zurückgesetzt werden (weil die Adresse des Handlers in einer neuen ausführbaren Datei keinen Sinn ergibt), aber das passiert nicht auf' fork'. –

+0

Danke, Sir ... Zweifel beseitigt ... – Puneet