2016-08-08 47 views
0

Also versuche ich, etwas schlecht und schmutzig zu tun;)Unit-Tests Befehl kill

Ich will kill nennen (0, SIGKILL) in meinen Scheck Unittest untergeordnete Prozesse zu töten ich mit diesem Test gestartet.

ck_assert_int_eq(magic(13), 13); //<- success, but I cannot stop magic now 

wenn ich

ck_assert_int_eq(kill(0, SIGKILL), 0); 

ich "Test: (nach diesem Punkt) Received Signal 9 (getötet)"

Gibt es Möglichkeiten, um ihn herum? Kill (0, SIGKILL) auch im eigentlichen Code getan, so denke ich, wenn ich versuche, Zerstörung Funktion von meinem Test zu nennen, werde ich mit dem gleichen Fehler enden.

+0

Ich verstehe nicht, was das erwartete Verhalten ist. – a3f

+1

Verwenden Sie SIGKILL nicht, wenn Sie es vermeiden können. Wenn Sie es verwenden, verwenden Sie kein erstes Argument von Null und verwenden Sie 'fork()', um ein Kind zu erstellen und das Kind Selbstmord begehen zu lassen. Wenn Sie "kill (0, SIGKILL)" noch testen müssen, verwenden Sie immer noch 'fork()', aber Sie müssen das Kind von seiner ursprünglichen Prozessgruppe isolieren ('setsid()' oder vielleicht 'setpgrp()' oder 'setpgid() '). –

+0

@ a3f Ich möchte Magie initialisieren, den Rückkehrcode von der Initialisierung überprüfen und dann beenden. – Oreols

Antwort

4

int kill (pid_t pid, int sig)

Wenn pid gleich 0 ist, dann sig wird jeden Prozess in der Prozessgruppe des Aufruf Prozesses gesendet.

Quelle: man 2 kill

Sie benötigen kill(child_pid, SIGKILL) nennen, weil child_pid == 0 Elternteil + Kind töten.

pid_t Gabel (void);

Nach erfolgreichem Abschluss gibt fork() 0 an den untergeordneten Prozess zurück und soll die Prozess-ID des untergeordneten Prozesses an den übergeordneten Prozess zurückgeben. Beide Prozesse sollen weiterhin von der Funktion fork() ausgeführt werden. Andernfalls muss -1 an den übergeordneten Prozess zurückgegeben werden, kein untergeordneter Prozess erstellt werden, und errno soll festgelegt werden, um den Fehler anzuzeigen.

Quelle: man 3 fork

+0

Sie müssen nur ein wenig Erklärung hinzufügen - wie 'kill (0, SIGKILL)' ist eine schlechte Idee und 'fork()' plus 'kill (getpid(), SIGKILL)' im Kind könnte sein, was benötigt wird. –