longjmp() aus signal-handler

Ich bin mit dem folgenden code, um zu versuchen, zum Lesen einer Eingabe von Benutzer und-timeout und beendet, wenn mehr als 5 Sekunden vergehen. Dies wird erreicht durch eine Kombination von setjmp/longjmp-und das SIGALRM-signal.

Hier der code:

#include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
#include <string.h>
#include <sys/signal.h>

jmp_buf buffer;

//this will cause t_gets() to return -2
void timeout() {
    longjmp(buffer, 1);
}

int t_gets(char* s, int t)
{
    char* ret;
    signal(SIGALRM, timeout);
    if (setjmp(buffer) != 0)
        return -2; //<--- timeout() will jump here
    alarm(t);
    //if fgets() does not return in t seconds, SIGALARM handler timeout()
    //will be called, causing t_gets() to return -2
    ret = fgets(s, 100, stdin);
    alarm(0);
    if (ret == NULL ) return -1;
    return strlen(s);
}

int main()
{
    char s[100];
    int z=t_gets(s, 5);
    printf("%d\n", z); 
}

Nun, meine Frage ist, ob es etwas gibt, die schief gehen können mit dieser Funktion. Ich habe gelesen, dass der Aufruf von longjmp() von einem signal-handler kann ein Undefiniertes Verhalten, was ist es genau refferring zum?

Auch, was passiert, wenn der alarm ausgelöst wird direkt nach der Funktion fgets() gibt, aber bevor alarm(0) aufgerufen wird? Wird es dazu führen, dass die Funktion return -2, selbst wenn der Benutzer hat die Eingabe etwas?

SPÄTER EDIT:
Ich bin nicht daran interessiert, Möglichkeiten, den code zu verbessern. Ich möchte nur wissen, wie könnte es scheitern.

  • ret ist nicht initialisiert, so der Aufruf fgets wird eine Speicherbeschädigung verursachen.
  • ret zugewiesen bekommt, mit dem Ergebnis, das fgets() Aufruf der Funktion.
  • fgets() liefert den ersten parameter, bei Erfolg oder NULL im Falle eines Fehlers. Ich sehe nicht, wie das könnte dazu führen, Speicher Korruption. Die Inhalte sind gespeichert in en.
  • Never mind--Magermilch zu schnell. Misread "fgets(s, ...)".
InformationsquelleAutor sttwister | 2009-11-11
Schreibe einen Kommentar