-3

シグナル SIGUSR2 を受信するたびに、ファイルから 1 行を読み取る必要があるプログラムがあります。1行きっちりの読み方以外は全て私が作りました。

ファイルの内容:

one
two
three
four
five
...
ten
4

3 に答える 3

4

関数を使用fgets()....改行が来るまで読み取ります...または、/nを取得したときにfgetcを使用して1文字ずつ読み取ることができます。その後、読み取り操作を終了できます

于 2013-04-16T10:37:10.403 に答える
3

OP はデータをシグナル ハンドラから読み取る必要があることを暗示しているため、使用する唯一read()の方法man 7 signalです。詳細については、こちらをお読みください: http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html

行のread()読み取りは、EOL 文字が見つかるまでバイトごとに読み取ることで実装できます。

読み取る前に、EOL を見つけるためにどのくらいのデータを読み取る必要があるかは明確ではありません。最大値を定義する必要があり、それを使用して読み取り先のバッファーを宣言するか、バッファー サイズを動的に増やす必要があります。ループしながらread()

アップデート:

抜粋形式man 7 signal(角括弧内は私によるコメント):

非同期シグナルセーフ関数

プログラムの実行中の任意の時点で他の場所の処理が中断される可能性があるため、シグナルハンドラ関数は非常に注意する必要があります。POSIX には「安全な機能」という概念があります。シグナルが安全でない関数の実行を中断し、ハンドラーが安全でない関数を呼び出した場合、プログラムの動作は未定義です。

POSIX.1-2004 (POSIX.1-2001 Technical Corrigendum 2 とも呼ばれます) では、次の関数をシグナル ハンドラー内で安全に呼び出すことができることを保証する実装が必要です。

[カットされたリスト、リストについては上記のリンクを参照]

于 2013-04-20T12:45:19.157 に答える
2

あなたが使用することができますfscanf()

fscanf(fp, " %[^\n]",buffer);

これにより、ファイルから 1 行を読み取ることができます。

ファイルから 1 行を読み取るたびに呼び出す

ノート:

  1. 使用するときは注意が必要です。行がこれよりも大きい場合、bufferオーバーフローが発生します。使用するバッファ サイズが常に各行のサイズよりも大きいことを確認する必要があります。

  2. ファイルの行が空白 ( isspace()で定義) で始まる場合、これらの空白はキャプチャされません。

于 2013-04-16T10:37:35.680 に答える