問題発見のきっかけ:
非同期通知を学習する際に、自分で機能を実装: ボタンを押してブザーを制御し、同時に LED ライトが点滅する
結果: LED はボタンによって同時に制御されているようです時間
最後に、デバッグの結果、
アプリケーション層のスリープがドライバー層のkill_fasyncによって中断されたため、次のループに再度入る前にスリープの実行が終了しなかったことがわかりました。
コードを修正した後、問題は解決されました
。解決策のロジック:スリープ機能が中断されるため、2 回目のスリープ時間を短くする
説明:
スリープ機能は中断できます。つまり、プロセスがスリープ中に中断された場合、その後、割り込みが終了して再度処理が実行されると、スリープ関数から処理が開始され、次のステートメントが実行されます。
これは、kill_fasync 関数に割り込みがあることを示しています。
PS:
なぜスリープは中断された直後に次の文を実行するのでしょうか? (ご質問ありがとうございます @dhy9974)
睡眠に関するマニュアルを見る
man 3 sleep
sleep関数に戻り値があることが判明
SLEEP(3) Linux Programmer's Manual SLEEP(3)
NAME
sleep - sleep for a specified number of seconds
SYNOPSIS
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
DESCRIPTION
sleep() causes the calling thread to sleep either until the number of real-time seconds speci‐
fied in seconds have elapsed or until a signal arrives which is not ignored.
RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep, if
the call was interrupted by a signal handler.
戻り値:
要求された時間が経過した場合は 0 を返し、
コールがシグナル ハンドラーによって中断された場合はスリープまでの残りの秒数を返します。
本当の睡眠を実現したい場合は、睡眠が中断されても大丈夫です、次のように書くことができます
int time;
while(time > 0){
time = sleep(time);
}