Fgets - blockierend oder nicht?

Hallo!

Ich habe fleißig gegoogelt, aber es bringt alles nichts. Vielleicht wisst ihr eine Antwort: blockiert fgets wenn in der pipe/fifo nichts drinsteht?

Mich würd das generell interessieren: welche Funktion blockiert und welche nicht? Kann man das vll irgendwo erfahren?

Es sollte blockieren, bin mir aber nicht 100% sicher. Laut der CPP-Referenz, welche auch eine Referenz für Standard C zur Verfügung stellt, liest fgets solang ein bis num - 1 oder EOF erreicht wurde. Soll heißen, solang eine pipe/fifo kein EOF sendet oder weniger als num - 1 sollte fgets blockieren. Käme dennoch auf einen test an der dies bestätigt.

Gut Schuß
VuuRWerK :wink:

Zum testen komm ich leider nicht, da mein Programm aus irgendeinem Grund hängt :frowning:

Vielleicht kann mir jemand helfen. Ich hänge die Dateien an, da es recht viel zum posten ist. Es soll ein Programm mit printserver und printclient werden. Der Client schickt über ne FIFO dem Server Nachrichten, und dieser druckt und sendet ne Statusmeldung zurück.

Das Problem ist jetzt in der printclient.c. Und zwar bei fopen in der main, die Ausgabe veräts. Nur hab ich mittlerweile keinen Schimmer an was es liegen könnte.

printclient.c häng ich der vollständigkeit halber, aber das funktioniert auch noch nicht.

EDIT: Dieses Problem besteht nicht mehr. Der Server bekommt jetzt vom Client die Aufträge. Aber es gibt immernoch Segfaults beim zurückschreiben.
Ich hab mal pro forma den Code aktualisiert. ACHTUNG: Durch die Segfaults wird die werden die fifos nicht entfernt (unlink). D.h. falls jemand auf den Code ausführt, die fifos muss man manuell löschen(„mainfifo“ und „printclient.“).

Ach, und… fgets() blockiert. Kann ich bestätigen.

So!

Jetzt gehts. Aber nur für sehr kleine Nachrichten. Bei einer Länge von ca. 10 Zeichen gibt es einen Fehler, denn ich mir nicht erklären kann.
Offenbar gibt es einen overflow beim Client, was ich nicht verstehen, den es ist genug Platz reserviert.
Vielleicht kann mir jemand sagen was ich da falsch mache!
Ich hänge eine Screenshot an.

p.s. ich habe einen sighandler intalliert, also kann man mit ctrl+c das programm beenden und die fifo unlinken

Das Problem tritt auch schon auf sofern Du mehr als 7 Zeichen sendest :wink:

Ich denke mal Du hast einfach einen Denkfehler was sizeof anbelangt, denn sizeof auf einen Pointer gibt immer die Größe der Adresse des Pointers zurück, d.h. auf einem 32bit System immer 4 (da 4byte für Adressen möglich) und auf einem 64bit System 8 (da 8byte für Adressen möglich). So allokierst Du in der Zeile:
message = (char *)malloc(sizeof(tmp) + sizeof(pid));
auch nur 8 byte für message (7 byte für Zeichen und 1 für den Null-Terminator ‚\0‘) da sizeof(tmp) == 4 und sizeof(pid) == 4. pid ist ein int, daher auf einem 32bit System 4byte.

Folgendes Testprogramm sollte Dir Klarheit schaffen:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char** argv)
{
  int pid = 1234;
  char* tmp;
  tmp = malloc(1024 * sizeof(char));
  printf("sizeof(tmp) + sizeof(pid) = %d
", sizeof(tmp) + sizeof(pid));
  free(tmp);
  return EXIT_SUCCESS;
}

D.h. Du bekommst auf einem dynamischen Weg die Größe eines char-Pointers nur durch iterieren heraus:

int i = 0;
while (*s++ != '\0') {  // assume s is a null-terminated char-pointer or you get an endless loop!
  ++i;
}

oder eben durch „merken“ der Größe beim allokieren.

Noch ein wichtiger hinweis: free nicht vergessen!!! Allen Unkenrufen zum trotz das sich das OS schon von allein darum kümmert, verlass Dich bitte NIE darauf! Schon allein auf Windoof wirst Du da ganz schnell Probleme bekommen!

Gut Schuß
VuuRWerK :wink:

Danke schön!

Jetzt funktionierts! Oder besser gesagt, hat funktioniert,bis ich wieder irgendeinen Mist gebaut habe, und jetzt nicht mehr finde, was. Jetzt printed der Server nämlich statt dem Text 1-2 Ziffern von der pid.

:frowning:

So ganz ohne Code kann ich das nicht beurteilen aber mir klingt das irgendwie danach als wenn Du in den falschen Sepcher greifst. Normalerweiße bedeutet das „undefined behavior“ aber in Deinem Falle liegen die message und die pid nebeneinander im Speicher, worauf Du beim auslesen jetzt die pid abgreifst anstatt die message. Wie gesagt nur eine Vermutung so ganze ohne Code :wink:

Gut Schuß
VuuRWerK :wink:

Es war einfach ein Denkfehler drin. Hab das mit den char * noch immer nicht ganz raus :frowning:

Aber jetzt läuft ja alles.

Dann frag ruhig wenn Du etwas nicht verstehst dann kann ich Dir eventuell etwas von meinem Licht abgeben :o)

Gut Schuß
VuuRWerK :wink:

Danke. Aber jetzt hab ichs scheinbar kapiert. Das Programm läuft, die files sind abgegeben… :slight_smile:

Außerdem kommt mir immer vor dass ich zuviel frag.

Zu viel fragen gibts nicht, schon gar nicht hier :wink:
Ich hab ebenfalls immer viele Frage, meistens kann ich mir durch suchen im Netz behelfen weil ich eventuell schon weiß nach was ich in etwas suchen muss. Aber wenn ich mal was nicht finden sollte oder nicht weiß nach was ich suchen muss frag ich genauso nach. Oder wenn ich Meinungen zu etwas hören will, wie beispielsweise meine Frage im Java-Forum zu sachen wie Class Loader, Build-Tools etc. dann frag ich ebenfalls :slight_smile:

Also keine Angst vor Fragen fragen, ein Forum wie dieses lebt davon! :wink:

Gut Schuß
VuuRWerK :wink:

Ok…ich komme drauf zurück!

Es sind ja noch paar Aufgaben in dem Semester…und es werden sich mir noch genug (sprich: viel zu viel) unlösbare Probleme stellen!