0

これは、私が使用しているコードのスリム化された例です。

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 にする必要があります。それはタイプミスでした。

4

1 に答える 1