现在位置: 首页 > C 教程 > 正文

C 库函数 - sigwait()

C 标准库 - <signal.h> C 标准库 - <signal.h>

描述

sigwait 函数是 C 标准库中的一个函数,用于同步等待信号的到来。它将指定的信号集中的信号之一移出队列并返回其编号。此函数定义在 <signal.h> 头文件中。

语法

int sigwait(const sigset_t *set, int *sig);

参数

  • const sigset_t *set:指向一个 sigset_t 类型的信号集变量,该信号集指定要等待的信号。
  • int *sig:指向一个整数变量,用于存储被捕获的信号编号。

返回值

  • 成功时返回 0。
  • 失败时返回一个错误码。

实例

以下是一个使用 sigwait 函数同步等待 SIGINT 信号的示例程序。该程序在等待信号期间打印消息,当捕获到 SIGINT 信号时,使用 sigwait 函数同步等待并处理信号。

实例

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

// 线程函数,等待 SIGINT 信号
void* wait_for_signal(void* arg) {
    sigset_t *set = (sigset_t *)arg;
    int sig;

    printf("Thread waiting for signal...\n");
    if (sigwait(set, &sig) == 0) {
        printf("Caught signal %d: %s\n", sig, strsignal(sig));
    } else {
        perror("sigwait");
    }

    return NULL;
}

int main() {
    pthread_t thread;
    sigset_t set;

    // 初始化信号集,并将 SIGINT 添加到信号集中
    sigemptyset(&set);
    sigaddset(&set, SIGINT);

    // 阻塞主线程中的 SIGINT 信号
    pthread_sigmask(SIG_BLOCK, &set, NULL);

    // 创建一个线程,等待 SIGINT 信号
    pthread_create(&thread, NULL, wait_for_signal, (void*)&set);

    // 主线程继续运行,直到按下 Ctrl+C 发送 SIGINT 信号
    while (1) {
        printf("Main thread running... Press Ctrl+C to send SIGINT\n");
        sleep(1);
    }

    // 等待子线程结束
    pthread_join(thread, NULL);

    return 0;
}

编译并运行程序后,按下 Ctrl+C 发送 SIGINT 信号,输出将是:

Main thread running... Press Ctrl+C to send SIGINT
Main thread running... Press Ctrl+C to send SIGINT
Main thread running... Press Ctrl+C to send SIGINT
Thread waiting for signal...
Caught signal 2: Interrupt

程序在主线程中阻塞 SIGINT 信号,并创建一个子线程来等待和处理 SIGINT 信号。当捕获到 SIGINT 信号时,子线程使用 sigwait 函数同步等待并处理信号。

解释

  • sigemptyset(&set);:初始化信号集为空。
  • sigaddset(&set, SIGINT);:将 SIGINT 信号添加到信号集中。
  • pthread_sigmask(SIG_BLOCK, &set, NULL);:在主线程中阻塞 SIGINT 信号,以便子线程可以处理它。
  • pthread_create(&thread, NULL, wait_for_signal, (void*)&set);:创建一个子线程来等待 SIGINT 信号。
  • sigwait(set, &sig);:子线程使用 sigwait 函数同步等待并处理 SIGINT 信号。

注意事项

  • sigwait 函数仅在信号集中的一个信号被捕获时返回。
  • sigwait 可以与信号掩码一起使用,以确保信号在预期的线程中被处理。
  • 使用 sigwait 可以避免信号处理程序中的竞态条件和复杂性。

C 标准库 - <signal.h> C 标准库 - <signal.h>