C 库函数 - sigwait()
描述
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;
}
#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
可以避免信号处理程序中的竞态条件和复杂性。