Linuxポーリングを中止します
-
27-09-2019 - |
質問
WindowsのDirectSoundからLinuxのAlsaにオーディオミキサーを移植しています。システムを使用して「投票」を呼び出す16のファイル記述子を投票しています。今、私は何らかの形で投票を中止できる必要があります。 Windowsでは、イベントを使用してwaitformultipleObjectsを使用しています。待機を中止する必要がある場合は、待機を引き起こすイベントの1つでseteventになりました。投票が返されるように、Linuxの「Ready」のファイル記述子をマークする方法はありますか?
私はPPOLLを見ましたが、私は信号に精通していないので、不必要な人種の状態を処理したくありません。つまり、ALSAがファイル記述子を「準備ができている」ように設定できる場合、私もできるはずです;)
解決
を使用してパイプを作る場合 pipe()
関数、出力の端をあなたに追加できます poll()
リスト。その後、パイプの入力端に何かを書き込むと、投票が戻ります。 Windowsバージョンと同じです。
スレッドや信号ハンドラーのような非同期を使用して、その機能を作成する必要があります。
別のオプションは使用することです sigaction()
信号ハンドラーを設定します それなし SA_RESTART
国旗。未使用の信号を次のように使用できます SIGUSR1
またはリアルタイム信号の1つ。中断したいとき poll()
次に、その信号を送信します poll()
-1で戻り、errnoはeintrに設定されます。
別の信号があなたを中断する可能性があります poll()
同様に、使用しない限り sigmask()
不要な信号をブロックします。
他のヒント
タイムアウトを使用して、出口条件を確認します。
while (not exit_condition):
int poll(struct pollfd *fds, nfds_t nfds, int timeout);