問題タブ [async-safe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - glibc の Async-Signal-Safe 関数のリストが必要です
syscall のラッパーではないが、snprintf()、dprintf() のようなもの
c - シグナルハンドラーにいるかどうかをテストする方法はありますか?
大規模なプロジェクトのさまざまな場所から呼び出すことができるログ モジュールに取り組まなければなりません。私が抱えている問題は、シグナルハンドラー内で実行されるコードからモジュールが呼び出される場合があることです。通常、logging モジュールには localtime() と strftime() を使用して時間データが含まれますが、もちろんこれらの呼び出しは非同期シグナルに対して安全ではなく、シグナル ハンドラー内から呼び出されるとデッドロックが発生する可能性があります。たとえば、処理中にすべてのシグナルハンドラーにフラグを設定させることを除いて、コードが現在シグナルハンドラーコンテキストで実行されているかどうかを確認する方法は (GNU/Linux システム上で) ありますか? シグナル ハンドラーを単純化したほうがよいと思いますが、この場合、ログ モジュールを呼び出す場所を選択することはできません。
c - Linuxシグナルマスク関数でのsig_atomic_tの使用法
私は最近、Advanced Linux Programmingという名前の本を研究していましたが、この質問に遭遇しました。この本はsig_atomic_t
、シグナルハンドラー関数でグローバルフラグまたはカウンターを設定した場合に、コンテキストスイッチが発生しないように変数型を使用する必要があると述べています。算術演算(すなわち++
)とそれらをレジスタに保存します。
私の質問はsig_atomic_t
、別のタイプを使用せずに使用すると、コンテキストスイッチが発生するとどうなるでしょうか。たとえば、プログラムが戻って後で保存するだけです。誰かが私たちのコードを不安定にしたりバグを犯したりするシナリオを教えてもらえますか?
linux - マルチスレッド アプリケーションで非同期シグナルを使用して共有 POSIX セマフォを管理する方法
同期のために POSIX セマフォ (初期値 = 1 のミューテックスとして使用) を使用するスレッドセーフ ライブラリを作成する必要があります。非同期信号を正しく管理するための問題がいくつか見つかりました。この静的ライブラリにリンクするアプリケーションがあり、アプリケーション (マルチスレッド) がライブラリの関数を呼び出します。一部の内部構造へのアクセスは、posix セマフォによって制御されます (ライブラリの内部です)。
SIGINT
1 つのスレッドがセマフォをロックしているときに非同期シグナル (たとえば ) が発生した場合、どのような追加が必要ですか? アプリケーションを再起動すると、セマフォが存在し、その値が であるため、デッドロックが発生します0
。非同期シグナルが発生したときにセマフォを解放できる機能がありますが、library_close
これを実行して確認する最良の方法はどれですか (その機能は、後に続く場合にのみシグナルセーフになると思いますexit
)? マルチスレッド アプリケーションでは、通常、すべてのシグナルに対して 1 つのスレッド マネージャーを使用することをお勧めします。
皆さん、ありがとうございました。
c - 書き込みまたは非同期セーフ関数を使用して、シグナル ハンドラーから int を出力します。
write
シグナルハンドラー内で(または非同期セーフ関数を使用して)ログまたは端末に数値を出力したい。バッファリングされた I/O は使用したくありません。
それを行うための簡単で推奨される方法はありますか?
たとえば、以下の代わりに(または任意の非同期セーフ関数)printf
を好むでしょう。write
文字列の印刷は簡単です。上記の代わりにprintf
(印刷せずにpid
)使用できます:
c++ - ベクトル (vector::operator[] および vector::size()) への読み取り専用アクセスは非同期で安全ですか?
vector<string>
私のプログラムは、 のシグナル ハンドラ内のの内容への読み取り専用アクセスを実行する必要がありますSIGINT
。(代わりに、固定長の C 文字列の固定サイズの配列を使用することもできます。) プログラムは、POSIX 環境で実行するように設計されています。
vector::operator[]
とはvector::size()
非同期セーフ (またはシグナル セーフ) ですか?
c - シグナル ハンドラーから非同期セーフでない関数を呼び出すと、常に安全ではありませんか?
シグナルハンドラーで非同期セーフでない関数を呼び出せるかどうかを調べています。
Linux の man ページからの引用 signal(7):
シグナルが安全でない関数の実行を中断し、ハンドラが安全でない関数を呼び出す場合、プログラムの動作はundefinedです。
とTLPI :
SUSv3 は、表 21-1 (非同期セーフ関数のリスト) にリストされていないすべての関数は、シグナルに関して安全でないと見なされることを指摘していますが、関数が安全でないのは、シグナル ハンドラの呼び出しが関数の実行を中断する場合のみであると指摘しています。安全でない関数、およびハンドラー自体も安全でない関数を呼び出します。
上記の引用の私の解釈は、シグナルハンドラーが非同期セーフでない関数を中断しなかった場合にのみ、シグナルハンドラーから非同期セーフでない関数を呼び出すことが安全であるということです。
たとえば、安全でない関数を呼び出す SIGINT のハンドラーをインストールしますcrypt(3)
。これは、再入不可、つまり安全ではないと思われます。
またprintf()
、 で無限ループを呼び出しmain()
、メイン スレッドのみを実行しています。
printf()
問題は、この単純な例に対するものです。ハンドラーが実行を中断し、安全でない関数を呼び出したときに、悪いことが起こることはありません。AFAK はprintf()
、コンソール ロックを取得し、バッファリングされた I/O を実行するための内部バッファを持っていますが、この例ではその状態は一貫しています。静的に割り当てられた文字列を返しますがcrypt()
、他の関数やスレッドとは共有されません。
私は何か誤解していますか?シグナルハンドラがメインプログラムの安全でない関数の実行を中断し、それ自体も安全でない関数を呼び出すことは常に安全ではないこと、または状況によっては安全であるということを誰かに明確にしてもらいたい(例: 上記の単純な例) ?
c - MP3 IDV2 タグサイズの読み取り
ID3V2 タグのサイズを読み取ろうとしています。私のコードは、この構造体に識別、バージョン、フラグ、およびサイズを含む最初のヘッダーを格納することになっています。コードはビット 0 からビット 9 まで読み取り、ここに格納します。
読む:
次に、tag.size の値をこの関数に渡します。この関数は、サイズのビットを unsyncsafe します。
ただし、synchsafe の戻り値は、ヘッダーだけの正しいサイズになることはありません。248627840 を取得しました。exif ツールを使用して再確認しましたが、正しくありませんでした。どんな種類の助けにも本当に感謝します