これは、私が使用しているコードのスリム化された例です。
void SleepIntr()
{
printf("Entering sleep...\n");
SleepEx(10000, TRUE);
printf("Sleep done...\n");
}
static BOOL WINAPI ctrl_handler(DWORD dwCtrlType) {
printf("ctrl_handler pressed\n");
// Wake program up!
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler(ctrl_handler, TRUE);
SleepIntr();
printf("awake!\n");
return 0;
}
これは、ctr+c が押されたときにスリープを中断し、プログラムの実行を継続して「awake!」を出力するという考え方です。または、少なくとも ctrl+c が押されたときの実行場所のスタック トレースを教えてください。
呼び出しは、ソケットからの読み取りのブロックなど、ブロックする任意のSleepEx
システム コールである可能性があります。
ctrl_handler
通話を中断するには、my に何を記入すればよいですか? プロセス全体を終了する以外に、何も見つかりませんでした。それが不可能な場合は、それを答えとして受け入れますが、その理由を本当に知りたいです。
nanosleep
代わりにを使用して、Linux 用にコーディングされた同等のプログラムを次に示しSleepEx
ます。
#include <signal.h>
#include <stdio.h>
#include <time.h>
void ctrl_c (int sid, siginfo_t *info, void *data) {
printf("Im a ctrl_c\n");
}
int main (int argc, char *argv[]) {
struct sigaction act = {0};
act.sa_sigaction = &ctrl_c;
sigaction(SIGINT, &act, NULL);
struct timespec t, t2;
t.tv_sec = 5;
t.tv_nsec = 0;
printf("sleep start\n");
nanosleep (&t, &t2);
printf("sleep end\n");
return 0;
}
それはまさに私が望むように機能します。nanosleep で Ctrl+c を押すと、すぐに中断され、「スリープ終了」を出力して実行が続行されます。Windows 上の SleepEx で同様のことができないのはなぜですか?
EDITへの2 番目の引数SleepEx
はもちろん TRUE にする必要があります。それはタイプミスでした。