Aufgabe6: Prob mit printf/stdout

printf gibt nicht auf stdout aus

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe6: Prob mit printf/stdout
Moin!
Kann es sein, dass in einem der Headerfiles die wir für timed brauchen der stdout umgebogen wird???
Ich habe das Problem, dass meine printf, die eigentlich nur Statusmeldungen am Server zurückgeben, diese nicht auf dem stdout ausgeben (und wo hin es wirklich fliesst konnte ich auch noch nicht feststellen).

Ich mache direkt nach den Initialisierungen in meiner main() ein printf, habe also vorher noch keine filediscriptoren erstellt oder umgebogen.
Dieses Printf sowie alle weiteren die danach kommen sollten, werden allerdings nicht auf meinem stdout ausgegeben…

Hier ma meine Includes:
stdio.h
stdlib.h
sys/socket.h
sys/types.h
unistd.h
errno.h
netinet/in.h
string.h
“current_time.h”

Das ganze passiert sowohl auf meinem Mandrake10 bei mir, als auch auf den faui07x Rechnern im CIP-Pool; hab auch mal printdir getestet, was ohne probs aufm stdout ausgibt… scheint also kein generelles Prob mit der shell zu sein…

Das Problem ist nicht essentiell… mein timed funzt wunderbar und die Statusmeldungen geb ich halt per fprintf aufm stderr aus… sind ja eh nur kosmetischer Natur… aber warum bei meinem timed nix aufm stdout ausgegeben wird würd mich schon ma interessieren…

MfG.
Enfi


Kann dir nur so viel sagen, dass es bei mir ohne probleme funktioniert, text auf stdout auszugeben. Wenn du jedoch im Kindprozess was auf stdout ausgibst, der ja “im hintegrund” läuft, kommt das nicht an. Aber du sagst ja, dass du das nich machst.


Werde heute abend wenn die abgabe rum is mal meinen Code hier posten…
Vielleicht fällt dann ja doch noch jmd. etwas auf…
Aber ich bin mir ziemlich sicher, dass es an mir nicht liegt…


Doch das funktioniert, dem System ist so ohne weiteres der Prozess nicht als Hintergrundprozess bekannt.

Versuch mal

int main() {
        switch (fork()) {
          case 0:
            printf("Child is running\n");
            return 0;
          case -1:
            perror("fork");
            return 0;
          default:
            printf("Father running\n");
        }
        return 0;
}

dann hab ich vielleicht das gleiche problem wie der thread ersteller, denn wenn ich in meinem kindprozess was mit printf ausgebe, kommt das nicht an :stuck_out_tongue:


das problem wurde schon in anderen threads angesprochen

wenn die stdout auf den socket den ihr mit accept zurückbekommt ausgeben wollt dann kommt das so selbstverständlich nicht direkt an

ihr müsst

printf(text);

und dann fflush(stdout);

fflush bewirkt dass der buffer von stdout auf den stream geschrieben wird

wenn ihr nach printf kein fflush ausführt wir der buffer erst nach einer bestimmten größe auf den stream geschrieben

je nachdem wie die optionen für den buffer gesetzt wurden

steht auch im fork thread weiter unten


Mein Problemchen hat sich immer noch nicht gelöst…
Keine Ahnung woran es liegt, aber evtl. kann einer von euch mir sagen woran es liegt, dass alles was auf den stdout läuft ind Nirvana geht…
Wie Ihr seht kommt der erste printf bevor ich irgendetwas an Filedescriptoren o.a. mache.

/* Header files */
#include <stdio.h>
#include <stdlib.h>
#include "current_time.h"
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
int main(int argc, char *argv[])
{
	char *timebuf;
	int i = 1;
	int port = 1025;
	int stay;
	int in;
	struct sockaddr_in sockin;
	pid_t pid;
	printf("Zeitserver wird gestartet..");
	/* Socket für Server erstellen */
	stay = socket(PF_INET, SOCK_STREAM, 0);
	/* Fehlerbehandlung */
	if (stay == -1)
	{
		perror("Socket für Server konnte nicht erstellt werden!");
		exit(-1);
	}
	printf("Socket für Clientverbindung erstellt..");

include sie sys headers mal ganz oben in deiner liste das hat nämlich schon manchmal das eine oder andere problemchen gelöst

nochwas
du hast net zufällig die ausgabe mit ctrl+S oder so ausgestellt oder?

der code scheint ok zu sein liegt wohl an was anderem


komisch, bei mir geht das:

faui08o [/tmp]> cat bla.c
/* Header files */
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char *timebuf;
    int i = 1;
    int port = 1025;
    int stay;
    int in;
    struct sockaddr_in sockin;
    pid_t pid;
    printf("Zeitserver wird gestartet..");
    /* Socket für Server erstellen */
    stay = socket(PF_INET, SOCK_STREAM, 0);
    /* Fehlerbehandlung */
    if (stay == -1)
    {
        perror("Socket für Server konnte nicht erstellt werden!");
        exit(-1);
    }
    printf("Socket für Clientverbindung erstellt..");
}
faui08o [/tmp]> gcc bla.c && ./a.out 
Zeitserver wird gestartet..Socket für Clientverbindung erstellt..faui08o [/tmp]> 

ein \n nach den Ausgaben waere schoen :slight_smile:


Das Problem mit der Ausgabe hatte ich bei vorherigen Aufgaben auch schon des öfteren. Keine Ahnung worans liegt. Dass es nicht am Programm selbst liegt, hab ich gemerkt, als ich das ganze mit ddd debuggen wollte und dort alle Ausgaben ganz normal angezeigt wurden.


Das kann am gepufferten stdout liegen, wie oben schon beschrieben. Wenn man ein printf macht, dann wird das zunaechst nur in einen Puffer geschrieben.
Dieser Puffer wird auf erst auf das Terminal(ein zugriff aufs terminal dauert viel laenger als internes Puffergeschreibe) geschrieben, wenn der Puffer voll ist, wenn ein newline (\n) kommt oder wenn ihr das explizit sagt durch ein fflush. Bei Programmende wird natuerlich auch ein fflush gemacht.

Problematisch wird das nur dann, wenn man eine Ausgabe erwartet und das Programm irgendwie ‘haengt’ z.B.

printf("bla");
a = accept(... 

Da ist “bla” im buffer und man koennte meinen, dass das Programm gar nicht zum accept kommt, weil ja bla nicht aufm Bildschirm erscheint.

Wenn man sauber arbeitet kommt das allerdings nicht vor, da

  1. Meldungen immer mit einem ‘\n’ abschliesen
  2. Man fuer Debugginginformationen und alle Infos zum Programmablauf auf stderr ausgibt, der ungepufferte ist (wenn mich nicht alles taeuscht).

Allerdings trat bei mir das Problem oft auf, obwohl in der Ausgabe ein newline vorkam und obendrein das Programm sofort nach Ausgabe beendet wird. Hab das nämlich mit HelloWorld getestet und nicht einmal bei diesem simplen Mini-Programm kam in der Konsole eine Ausgabe.

Wie gesagt, es ist mir schleierhaft, wann und warum dies auftritt. Am Puffern kann das denk ich nicht liegen.


doch, kann schon.
BIn jetzt auch nicht 100% sicher - wuerde in der Situation
aber als erstes mal ein
“fflush(stdout);”
nach den fraglichen printfs einfuegen.
Erst wenn dann immer noch nix kommt, wuerde ich weiter nachdenken.