2010-12-29 16 views

答えて

6

できません。 async-signal-safe関数のリストについては、マンページsignal(7)を参照してください。 fprintfはそのリストに含まれていません。

フォーマットする必要がない場合は、write(STDERR_FILENO, <buf>, <buflen>)を使用してstderrに書き込むことができます。

+0

libcの関数リストまたはカーネルのシステムコールリストですか? – osgx

+0

http://linux.die.net/man/7/signalリストはありません。私にリンクを教えてもらえますか? – osgx

+1

@osgx:リンクが追加されました。 posix関数のリストで、libcの標準も含まれています。しかし、libc標準では、libc関数(signal()を除く)は再入可能である必要はないため、シグナルハンドラ内でlibc関数を(移植可能に)使用することはできません。 – Fabian

4

これは安全ではありません、引用IBM developerWorksの記事を、約Signal Handling Safety

シグナルハンドラはfprintfのでメッセージを出力し、プログラムが同じストリームを使ってfprintfの呼び出しの真ん中にあったと仮定信号が配信されたとき。両方の呼び出しが同じデータ構造(ストリーム自体)で動作するため、シグナルハンドラのメッセージとプログラムのデータの両方が壊れている可能性があります。

+0

glibcにFILE *内にIOロックがあります。したがって、最初のfprintfを中断するfprintfは待機します – osgx

+4

@osgx:シグナルハンドラはスレッドではありません。シグナルハンドラ内で待機することは、シグナルハンドラが完了するまでロックを保持しているスレッドが進めることができないため、非常に悪いニュースです。だからあなたはデッドロックしている。 –

+0

@Ben Voigt、私は本当に "スレッド"と言いますか? – osgx

関連する問題