3

Windows の directsound から Linux の alsa にオーディオ ミキサーを移植しています。システムコール「poll」を使用して、たとえば16個のファイル記述子をポーリングしています。今、何とかポーリングを中止できるようにする必要があります。Windowsでは、イベントを使用してWaitForMultipleObjectsを使用しています。待機を中止する必要がある場合は、イベントの1つにSetEventを設定するだけで待機が戻ります。ポーリングが返されるように、Linux でファイル記述子を「準備完了」とマークする方法はありますか?

私は ppoll を見てきましたが、シグナルに慣れておらず、不必要な競合状態を処理したくありません。つまり、alsa がファイル記述子を「準備完了」に設定できる場合、私もできるはずです ;)

4

2 に答える 2

3

この関数を使用してパイプを作成するとpipe()、出力端をリストに追加できますpoll()。次に、パイプの入力端に何かを書き込むことができ、ポーリングが返されます。Windowsバージョンとよく似ています。

それを機能させるには、スレッドやシグナルハンドラーなどの非同期のものを使用する必要があります。

別のオプションは、フラグなしsigaction()でシグナルハンドラーを設定するために使用することです。リアルタイム信号のような未使用の信号を使用することができます。割り込みたい場合は、その信号を送信し、-1とerrnoをEINTRに設定して戻ります。SA_RESTARTSIGUSR1poll()poll()

不要な信号をブロックしてpoll()いない限り、別の信号があなたにも割り込む可能性があります。sigmask()

于 2010-10-29T04:47:30.020 に答える
-1

タイムアウトを使用して、終了条件を確認してください。

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
于 2010-10-29T04:30:22.010 に答える