コマンドラインの標準入力から、任意の長さの行を一度に1つずつ読み取ろうとしています。 GNU readlineを含めることができ、ライブラリ関数を使用することを好むかどうかはわかりません。
私が読んだドキュメントでは、getline
は機能するはずですが、私の実験ではブロックしません。私のサンプルプログラム:
#include <stdio.h>
int main()
{
char *line = NULL;
if (getline(&line, NULL, stdin) == -1) {
printf("No line\n");
} else {
printf("%s\n", line);
}
return 0;
}
No line
。これは、ユーザー入力の受け入れに適さないものにします。
どうすればいいですか?私はそれが些細なものであるべきだと知っていますが、私はそれを理解することができませんでした。
このパッチを試してください
char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
printf("No line\n");
} else {
getline
で「ノンブロッキング」動作を再現できました。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *buffer;
size_t n = 1024;
buffer = malloc(n);
return getline(&buffer, &n, stdin);
}
getline(&buffer...
ブロック。 NULL
にbuffer
を割り当てると、再び(アドバタイズされたように)ブロックされ、新しく割り当てられたバッファーに行が格納されます。
しかし、私が書いたら
getline(NULL, &n, stdin);
getline
は失敗し、seemsはブロックしません。おそらく、無効なn
またはファイルポインターも同じ動作を引き起こす可能性があります。これが問題なのでしょうか?