ローカルバッファに書き込む場合、再入可能関数でsprintfを使用できますか?このようなもの:glibc sprintfをリエントラント関数で使用できますか?
void reentrant_function() {
int i = 4;
char buffer[20];
snprintf(buffer, 20, "%d", i);
}
ローカルバッファに書き込む場合、再入可能関数でsprintfを使用できますか?このようなもの:glibc sprintfをリエントラント関数で使用できますか?
void reentrant_function() {
int i = 4;
char buffer[20];
snprintf(buffer, 20, "%d", i);
}
buffer
がstatic
でない限り、可能です。
はい。
なぜあなたはできないと思いますか?グローバルはありません。
バッファは関数のローカルなので、なぜ文字列を書式化して何もしたくないのでしょうか?
- snprintfの実装で静的データが使用されているかどうかはわかりませんでした。あなたの2番目の質問に答える:send()を使ってバッファをソケットに書き込む予定です。私はそれもまたリエントラントであると想定しています(私はerrnoも注意しなければなりません)。私はその前提で正しいのでしょうか? –
私も同じ質問をしているので、このページに行きます。ここで私は本から読んだものです:
UNIX環境での高度なプログラミング:図10.4 (中リエントラント関数の一覧ではありませんSecond Editionの
10.6
ほとんどの関数は、 )は、(a)静的データ構造を使用することが知られており、(b)mallocまたはfreeを呼び出すか、(c)標準入出力ライブラリの一部であるために欠落しています。彼らは彼らの 内部の簿記のための静的なデータ構造を使用している場合
のLinuxプログラミングインタフェース
章21.1.2
機能も非リエントラントすることができます。このような関数の最も明白な例は、 のstdioライブラリ(printf()、scanf()など)であり、バッファされたI/O用の内部データ 構造を更新します。
私はそれが実装に依存していると思います。また、実際にsnprintfをどのように使用するか(バッファは不可欠です)によって異なります。質問に対する最も安全な答えは「いいえ」であるべきです。
この回答はおそらく正しいですが、それは明らかではありません。標準では、 'snprintf'がリエントラントである必要はありません(これはスレッドセーフではないよりはるかに強力な要件です)。 glibcがリエントラントにすると、標準の要件を上回ります。 –