[解決済み] 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はキャッシュされないことが多いです)。
最後に、プログラムが終了したときに出力が表示されます(そのときにフラッシュされるからです)が、これがおそらく残りの動作の説明です。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み] struct has no member named
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
-
[解決済み】C言語のprintfで%(パーセント)記号をエスケープする方法
-
[解決済み】fprintf、printf、sprintfの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC