1. ホーム
  2. c

[解決済み] C言語のprintfとfprintf(stdout,)が印刷されない

2022-01-28 19:38:42

質問

ちょっと変な話なんですが。私のコードは私が思うように出力されませんでした。どこで間違っているのかを確認するために、様々な段階でprintステートメントを追加しました。それでもダメでした。 そこで、mainの最初にprintfステートメントを追加してみました。そこで私は本当に混乱しました。

そこで、ファイルディスクリプタで何かおかしなことが起きているのではと推測しました。そこで printf から fprintf . まだ何もありません。標準エラー出力に fprintf は動作します。なぜこのようなことが起こるのでしょうか?

main から最初の print 文と return 以外の本文をすべて削除すると、印刷されます。

コード

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;
}

解決方法は?

出力はシステムによってバッファリングされることが多い。fflush を呼び出すこともできますが、キャッシュの動作によっては、単に出力を改行で終わらせるだけで十分な場合もあります。そこで、次のように変更してみてください。

fprintf(stdout, "STARTED!");

になります。

fprintf(stdout, "STARTED!\n");

それでもだめなら

fprintf(stdout, "STARTED!\n");
fflush(stdout)

(そして、エラーをすぐに見たいので、stderrはキャッシュされないことが多いです)。

最後に、プログラムが終了したときに出力が表示されます(そのときにフラッシュされるからです)が、これがおそらく残りの動作の説明です。