C printf et fprintf(stdout) ne sont pas l'impression
C'est un peu bizarre. Mon code n'était pas sortie de ce que j'ai pensé qu'il devrait. J'ai ajouté quelques instructions d'impression, à différents stades de voir où il allait mal. Toujours rien.
J'ai donc ajouté une instruction printf au début du main. C'est là que je me suis vraiment confus.
J'ai donc présumé de quelque chose de drôle qui se passait avec les descripteurs de fichier. J'ai changé le printf
à un fprintf
. Toujours rien. L'impression à la sortie stderr avec fprintf
fonctionne! Pourquoi est-ce arrivé?
De supprimer tous les corps de l'appareil principal à l'exception de la première instruction print et le retour ne imprimer.
Code
int main(void) {
fprintf(stdout, "STARTED!");
//Create an Internet domain socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
//If this fails exit and print the error
if (sockfd == -1) {
printf("Error %d, cannot create socket", errno);
return 1;
}
printf("SOCKET CREATED!");
//Creates a socket address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
//Attempts to bind to the socket address, again prints to error if this fails.
if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
{
printf("Error %d, cannot bind", errno);
return 1;
}
//Starts Listening for a client
if (listen(sockfd, 1) == -1)
{
printf("Error %d, cannot listen", errno);
return 1;
}
//If all is successful, server is operational
while(1)
{
//Creates a file descripter for the connection
int connfd;
//And a socket address for the client
struct sockaddr_in cliaddr;
socklen_t cliaddrlen = sizeof(cliaddr);
//If a connection attempt is made accepts it.
connfd = accept(sockfd, (struct sockaddr *) &cliaddr, &cliaddrlen);
if (connfd == -1) {
//If the connection fails print an error
printf("Error %d, cannot accept connection", errno);
continue;
}
//Otherwise process the request
else {
printf("CONNECTED!");
char end;
end = 1;
while (end)
{
process_request(connfd);
end = 0;
}
}
close(connfd);
}
close(sockfd);
return 0;
}
Oh, et je suis sûr que le code lui-même peuvent être améliorés pour toutes les suggestions d'amélioration serait aussi génial!
command 1>&2
aidera si vous voulez stdout pour ne pas être tamponnée comme stderr.OriginalL'auteur Hector | 2013-02-09
Vous devez vous connecter pour publier un commentaire.
De sortie est souvent tempérée par le système. Vous pouvez appeler fflush, mais parfois, selon la façon dont la mise en cache fonctionne, il suffit de mettre fin à la sortie avec un saut de ligne est suffisante. Donc, essayez de changer de
à
Et, si cela ne vous aide pas, à
(Et stderr n'est pas souvent mis en cache, comme vous voulez voir immédiatement les erreurs.)
Enfin, vous verrez la sortie lorsque le programme se termine (comme les choses sont rincés à l'époque), ce qui explique probablement le reste de la conduite.
Parfois, le tampon est vidé sur son propre, trop. Je ne suis pas sûr de la façon prévisible, il est à moins de vous appeler
fflush
ou mettre un\n
.OriginalL'auteur andrew cooke