signal, sigint, fclose und unlink

lordosiris

Mitglied
Guten Abend,

ich hab ein Programm geschrieben, welches auf der einen Seite einen Server miemt.
Dieser Server öffnet eine FIFO, nimmt dort etwas entgegen und bearbeitet das.
Ein dazu passendes Client Programm hab ich auch geschrieben, welches eben etwas in diese FIFO schickt.

Jetzt läuft der Server quasi endlos und wird nur durch CTRL+C terminiert. Wenn ich das aber so rabiat mache, bleibt der (?) FIFO bestehen und wenn man den Server neu aufruft/neu startet, meckert er zurecht, dass es den FIFO schon gibt und, da er ihn nicht erstellen kann, beendet er sich.

Ich hab mir also gedacht, CTRL+C einfach abzufangen.

Gesagt getan, hab ich ein einfaches signal(SIGINT,ctrlc_handler); eingebaut und mir die Funktion folgenderweise gebastelt:

C:
void ctrlc_handler(int signal){
	FILE *receive_fifo;
	if (fclose(receive_fifo) == EOF){ perror("fclose"); exit(EXIT_FAILURE); }
	if (unlink("printserver") == -1){ perror("flose");exit(EXIT_FAILURE); }
	exit(0);
}

Ist mein Gedankengang so falsch?
Immerhin, wenn ich nun terminiere, kommt nur: Speicherzugriffsfehler (Speicherabzug geschrieben), er beendet sich und der FIFO bleibt trotzdem bestehen.

Wo habe ich denn den Denkfehler?
 
Dein Denkfehler ist, das der lokale FILE-Pointer offen ist. Du hast vermutlich eine Funktion, in der die FIFO geöffnet wird. Und dort wird der FILE-Pointer ebenfalls lokal sein. Du müsstest dafür sorgen, das der File-Pointer global verfügbar ist.

Der fclose() wird in diesem Fall fehlschlagen und den Segfault verursachen.
 
Das heißt ich müsste den FILE *receive_fifo Pointer aus der main auch im ctrlc_handler haben?

Muss ich mal Googlen, wie das geht!
 
Das ist ganz einfach. Nimm die Variable aus main() raus und pack sie in den globalen Bereich. Beispiel:

C:
FILE *receive_fifo;

void ctrlc_handler_function(int signal)
{
  // Diese Variable darf nicht lokal sein
  //FILE *receive_fifo;
  ...
}

int main(int argc, char **argv)
{
  // Diese Variable darf nicht lokal sein
  //FILE *receive_fifo;
  ...
}
 
Zurück