2012年3月31日土曜日

[C 语言] 信号 block unblock 处理

/*
 * Blocked calculation 执行过程中, 信号 kill -INT xxx 被屏蔽, 所以程序没有反映
 * 只有到信号被取消阻塞的时程序才会结束
 * 信号屏蔽只是将信号加入到信号阻塞集合之中, 并没有丢弃, 一旦信号屏蔽取消, 信号就会发生作用
 */

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    sigset_t intmask;
    int i, repeat_factor = 10;

    sigemptyset(&intmask);
    sigaddset(&intmask, SIGINT); // 添加 block 或 unblock 的信号
    // sigaddset(&intmask, SIGTERM);

    while(1) {
        sigprocmask(SIG_BLOCK, &intmask, NULL); // block
        fprintf(stderr,"SIGINT signal blocked\n");
        for(i = 0; i < repeat_factor; i++) {
            sleep(1);
            fprintf(stdout, "[%d] calculating...\n", i);
        }
        fprintf(stdout, "Blocked calculation is finished\n");

        sigprocmask(SIG_UNBLOCK, &intmask, NULL); // unblock
        fprintf(stdout, "SIGINT signal unblocked\n");
        for(i = 0; i < repeat_factor; i++) {
            sleep(1);
            fprintf(stdout, "[%d] calculating...\n", i);
        }
        fprintf(stdout, "Unblocked calculation is finished\n");
    }
    exit(0);
}

0 件のコメント:

コメントを投稿