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.
Zum testen komm ich leider nicht, da mein Programm aus irgendeinem Grund hängt
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.“).
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
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:
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!
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.
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
Zu viel fragen gibts nicht, schon gar nicht hier
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
Also keine Angst vor Fragen fragen, ein Forum wie dieses lebt davon!