1. 首页
  2. 考试认证
  3. 其它
  4. sigpending函数-hds ams 2500用户手册

sigpending函数-hds ams 2500用户手册

上传者: 2024-07-22 16:40:29上传 PDF文件 17.98MB 热度 9次

10.13 sigpending函数sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过set参数返回。


#include <signal.h>

int sigpending(sigset_t *set);

signal.h>

返回:若成功则为0,若出错则为-1。

实例程序10-11使用了很多前面说明过的信号功能。进程阻塞了SIGQUIT信号,保存了当前信号屏蔽字(以便以后恢复),然后睡眠5秒钟。在此期间所产生的退出信号都被阻塞,不递送至该进程,直到该信号不再被阻塞。在5秒睡眠结束后,检查是否有信号未决,然后将SIGQUIT设置为不再阻塞。注意,在设置SIGQUIT为阻塞时,我们保存了老的屏蔽字。为了解除对该信号的阻塞,用老的屏蔽字重新设置了进程信号屏蔽字(SIG_SETMASK)。另一种方法是用SIG_UNBLOCK使阻塞的信号不再阻塞。但是,应当了解如果编写一个可能由其他人使用的函数,而且需要在函数中阻塞一个信号,则不能用SIG_UNBLOCK解除对此信号的阻塞,这是因为此函数的调用者在调用本函数之前可能也阻塞了此信号。在这种情况下必须使用SIG_SETMASK将信号屏蔽字恢复为原先值。10.18节的system函数部分有这样的一个例子。在睡眠期间如果产生了退出信号,那么此时该信号是未决的,但是不再受阻塞,所以在sigprocmask返回之前,它被递送到本进程。从程序的输出中可以看到这一点:SIGQUIT处理程序(sig_quit)中的printf语句先执行,然后再执行sigprocmask之后的printf语句。

如果对这一过程感兴趣,您可以参考更多关于唤醒阻塞休眠线程示例非阻塞通信例子。Python开发者可以查看Python socket非阻塞模块应用示例,而Java开发者可能会对Java多线程阻塞与唤醒代码示例感兴趣。这些资源将为您提供更全面的理解和更多的实践例子。

程序10-11:信号设置和sigprocmask实例。


#include <signal.h>

#include <stdio.h>

#include <unistd.h>



void sig_quit(int signo) {

    printf("caught SIGQUIT\n");

}



int main(void) {

    sigset_t newmask, oldmask, pendmask;



    if (signal(SIGQUIT, sig_quit) == SIG_ERR) {

        perror("can't catch SIGQUIT");

        return 1;

    }



    sigemptyset(&newmask);

    sigaddset(&newmask, SIGQUIT);



    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {

        perror("SIG_BLOCK error");

        return 1;

    }



    sleep(5);



    if (sigpending(&pendmask) < 0) {

        perror("sigpending error");

        return 1;

    }



    if (sigismember(&pendmask, SIGQUIT)) {

        printf("SIGQUIT pending\n");

    }



    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {

        perror("SIG_SETMASK error");

        return 1;

    }



    printf("SIGQUIT unblocked\n");



    sleep(5);

    return 0;

}

unistd.h>stdio.h>signal.h>

这一程序展示了如何使用信号屏蔽字来控制进程对信号的响应。是不是很有趣?快试试吧!

下载地址
用户评论