Ich schreibe eine debugging utility, und ich möchte fork
ein Kind, während verhindert, dass die Kündigung des Kindes eine SIGCHLD
zu seinem Elternteil auslösen. Ich möchte immer noch, dass andere Kinder nach der Beendigung normalerweise SIGCHLD
verursachen.Gibt es eine Möglichkeit zu verhindern, dass nur ein bestimmtes Kind eine SIGCHLD auslöst?
Ich möchte dies tun, weil ich nicht wollen fork
einen vorhandenen $SIG{CHLD}
Handler auslösen, aber ich möchte immer noch andere Kinder, um es auszulösen. Das heißt, ich möchte mein neues Kind isolieren und ich möchte nicht, dass es die Verwaltung bestehender Kinder beeinträchtigt.
Ich bin vorsichtig bei der lokalen Installation eines benutzerdefinierten $SIG{CHLD}
Handler, da ich glaube nicht, kann ich richtig erkennen, wenn ich den ursprünglichen Handler aufrufen sollte. Zum Beispiel, wenn ich einen lokalen $SIG{CHLD}
Handler installiere, dann bin ich garantiert, ein SIGCHLD
Signal zu erhalten, sobald ich ein Kind spawne und das Elternteil waitpid
dafür habe, es zu beenden. Das SIGCHLD
wird jedoch nicht anzeigen, ob andere Kinder ebenfalls beendet wurden oder nicht, so dass ich nicht sicher sein kann, ob der ursprüngliche Handler aufgerufen werden soll.
Ich recherchierte, dass ein Prozess seine Eltern-PID nicht ändern kann. Ich bin mir nicht sicher, ob das Ändern der Prozessgruppen-ID oder der Sitzungs-ID des Kindes nützlich wäre.
Ist es sogar möglich zu verhindern, dass ein bestimmtes Kind die SIGCHLD
auf dem Elternteil auslöst? Muss ich mich auf den vorhandenen $SIG{CHLD}
-Handler verlassen, um das Richtige zu tun, wenn er das SIGCHLD
-Signal für ein Kind empfängt, das er nicht erwartet hat?
Obwohl es möglicherweise eine bessere Möglichkeit gibt, dieses Debugging-Dienstprogramm zu implementieren (lassen Sie mich wissen, wenn es gibt), frage ich mich immer noch, ob POSIX bietet so eine feinkörnige Kontrolle über Kinder, und bin auf der Suche nach einer Perl-Lösung für meine Dilemma.
Dieser Ansatz kann oder kann nicht verhindern, dass die ursprüngliche SIGCHLD (Portabilitätsproblem), aber wenn es nicht wartet, wird nie den Debugprozess zurückgeben. –
So perfekt wie es nur geht! Auf meinem Macbook (OS X 10.8.2) funktioniert das wie gewünscht.Außerdem liebe ich Ihre 'Signal :: Mask' und' Signal :: Pending' Module; Sie haben es sehr einfach gemacht, das Verhalten auf meinem System zu erforschen. :) – Mohith