Frage

Ich spiele mit waitpid () und Signal () und ich bin auf der Suche nach zuverlässigen Testfälle für die Rückgabe WIFSIGNALED (Status) = WIFSTOPPED (Status) = WIFCONTINUED (Status) = true kann aber keine finden .. .

Pflege mir sagen, wie kann ich sicher sein, diejenigen true zurück, so kann ich meinen Code debuggen?

Auch ein paar Hinweise über welche Signale sollte ich mit dem Signal zu fangen (), um diese Makros zu testen, wäre hilfreich ...

War es hilfreich?

Lösung

#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

#define NELEMS(x) (sizeof (x) / sizeof (x)[0])

static void testsignaled(void) {
   kill(getpid(), SIGINT);
}

static void teststopped(void) {
   kill(getpid(), SIGSTOP);
}

static void testcontinued(void) {
   kill(getpid(), SIGSTOP);
   /* Busy-work to keep us from exiting before the parent waits.
    * This is a race.
    */
   alarm(1);
   while(1) {}
}

int main(void) {
   void (*test[])(void) = {testsignaled, teststopped, testcontinued};
   pid_t pid[NELEMS(test)];
   int i, status;
   for(i = 0; i < sizeof test / sizeof test[0]; ++i) {
      pid[i] = fork();
      if(0 == pid[i]) {
         test[i]();
         return 0;
      }
   }
   /* Pause to let the child processes to do their thing.
    * This is a race.
    */
   sleep(1);
   /* Observe the stoppage of the third process and continue it. */
   wait4(pid[2], &status, WUNTRACED, 0);
   kill(pid[2], SIGCONT);
   /* Wait for the child processes. */
   for(i = 0; i < NELEMS(test); ++i) {
      wait4(pid[i], &status, WCONTINUED | WUNTRACED, 0);
      printf("%d%s%s%s\n", i, WIFCONTINUED(status) ? " CONTINUED" : "", WIFSIGNALED(status) ? " SIGNALED" : "", WIFSTOPPED(status) ? " STOPPED" : "");
   }
   return 0;
}

Andere Tipps

Handhabung WIFSIGNALED ist einfach. Das Kind Prozess kann Selbstmord mit dem kill() Systemaufruf begehen. Sie können auch für Core-Dumps überprüfen - einige Signale erzeugen sie (SIGQUIT, IIRC); einige Signale nicht (SIGINT).

WIFSTOPPED Handhabung kann schwieriger sein. Der einfache Schritt zu versuchen, ist für das Kind selbst SIGSTOP mit dem kill() Systemaufruf erneut zu senden. Eigentlich, denke ich, dass sollte funktionieren. Beachten Sie, dass Sie vielleicht prüfen, auf SIGTTIN und SIGTTOU und SIGTSTOP - ich glaube, sie zählen für WIFSTOPPED. (Es gibt auch eine Chance, dass SIGSTOP nur sanely funktioniert, wenn durch einen Debugger an einen Prozess geschickt wird es über den Nicht-POSIX-Systemaufruf ausgeführt wird, ptrace().)

Handling WIFCONTINUED ist etwas, das ich denke, die Eltern zu tun hat; nachdem Sie erkennen ein Prozess beendet wurde, sollten Sie Ihre Telefonvorwahl es durch Senden eines SIGCONT Signal (kill() wieder) weiter machen. Das Kind kann das nicht liefern selbst; es wird gestoppt. Auch hier bin ich nicht sicher, ob es um zusätzliche Falten zu sorgen -. Wahrscheinlich

Ein Rahmen so etwas wie die folgenden können Sie die Ergebnisse der wait() und waitpid() Anrufe überprüfen.

pid_t pid = fork();

if (pid == 0) {
    /* child */
    sleep(200);
}
else {
    /* parent */
    kill(pid, SIGSTOP);

    /* do wait(), waitpid() stuff */
}

Sie müssen nicht tatsächlich die Signale fangen (mit signal() oder verwandter Funktion), die gesendet werden. signal() installiert einen Handler, der das Standardverhalten für das spezifische Signal überschreibt - also, wenn Sie für ein Signal überprüfen möchten Ihr Prozess beendet wird, eine auswählen, die dieses Standardverhalten hat -. „man -s7 signal“ gibt Ihnen Details ein Standardverhalten des Signals

Für die Makros, die Sie verwenden SIGSTOP für WIFSTOPPED(status), SIGCONT für WIFCONTINUED (status) und SIGINT für WIFSIGNALED(status) erwähnt

Wenn Sie für die Prüfung mehr Flexibilität wünschen, töten Sie nutzen könnten (siehe „man kill“) Signale an Ihren Prozess zu senden. kill -l listet alle Signale, die gesendet werden können.

in Ihren Tests können Sie fork () aufrufen und spezifische Signal an Ihr Kind Prozesse schicken? In diesem Szenario sind Ihr Kind Prozesse Testfälle?

Bearbeiten

meine Antwort ist etwa ein C-Test-Codierung. Sie Gabel, die pid des Kindes Prozess erhalten (der Prozess mit Signal-Handler installiert ist), dann können Sie Signal, um es durch die Verwendung kill(2) zu senden. Auf diese Weise können Sie den Exit-Status testen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top