私は再入可能な呼び出しについて何かを学ぼうとしており、使用しようとしています_vsnprintf_r()
。最初のパラメーターは some のようstruct _reent *
です。Cygwin では、次のように使用できるようです_vsnprintf_r (_REENT, /* rest of the arguments here */)
。これは正しいです?Cygwinの外でもこれは正しいですか? これについては、特定のドキュメントが不足しているようです。私の Google と Bing の検索はあまり実りがありませんでした。
2 に答える
_vsnprintf_r
標準機能ではありません。これは、内部使用のためにcygwin開発チームによって作成されました。
は通常の人_vsnprintf_r
によって呼び出されるので、cygwinでこの呼び出しの通常のバージョンvsnprintf
を使用することに固執します。C
とにかく再入可能であるというcygwinからの保証はありません_vsnprintf_r
。特に、それに関するドキュメントが見つからない場合はそうです。
cygwinは、それに対してリンクするすべてのプロセス間で状態を共有する動的にロードされたライブラリを使用するため_<xxx>_r
、呼び出しのバージョンを使用して、通常は標準のUNIXシステムのデフォルトである独自の状態のインスタンスを各プロセスに与えます。これらの関数はcygwinによって内部的に使用されるため、 cygwin-developersメーリングリストが質問に適したリソースであることがわかります。
これは、POSIXで定義されたリエントラント関数(のようなgmtime_r
)とは対照的です。これらの非再入可能バージョンは、ライブラリ内の静的メモリへのポインタを返したため、関数が呼び出し元から渡されたメモリを代わりに使用できるように、再入可能バージョンが作成されました。
おそらく、再入可能な呼び出しで何かを「印刷」したくないでしょう。なぜなら、どの順序で、またはいつ「印刷」されるかわからないからです。
一般的に、再入可能な関数を作成するには、すべてを関数に渡します (静的変数は使用しません)。ローカル (スタック) 変数は問題ありません。
印刷は、セマフォ (またはその他のロック機構) の「古典的な」問題です。さもないと、
こんにちは世界
になる
HeWlorllod
またはせいぜい
ヘルワールド