当我在 signal _handler 和 main 函数中处理变量时如何屏蔽信号
How to mask a signal when I handle a variable in signal _handler and in main function
我正在尝试将内容从一个文件复制到另一个文件,使用 SIGINT 程序被中断以打印复制的字节数。我尝试在标志初始化、标志检查和标志清除时使用 sigprocmask 以避免竞争条件。但我不知道如何检查这个 sigprocmask 是否有效。为此,我找了好久。
void signal_handler(int num)
{
flag = 1;
}
int main()
{
signal(SIGINT, signal_handler);
ret = sigaddset(&set, SIGINT);
/* Code for
* copying the bytes from one file to another
*/
sigprocmask(SIG_BLOCK, &set, NULL);
if (flag == 1)
printf("The number of bytes copied are :%llu\n", bytes);
flag = 0;
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
}
它应该会如您所愿。您唯一需要确保的是 flag
是 volatile sig_atomic_t
类型以避免 flag
.
上的数据竞争
举个例子。循环连续打印 bytes
的值(它会在 bytes
达到 UINT64_MAX
的某个点回绕)。可以重复发送SIGINT
进行测试
#include <stdio.h>
#include <signal.h>
#include <inttypes.h>
volatile sig_atomic_t flag = 0;
void signal_handler(int num)
{
flag = 1;
}
int main(void)
{
uint64_t bytes = 0;
sigset_t set;
signal(SIGINT, signal_handler);
int ret = sigaddset(&set, SIGINT);
while(1) {
bytes++;
sigprocmask(SIG_BLOCK, &set, NULL);
if (flag == 1)
printf("The number of bytes copied are :%" PRIu64 "\n", bytes);
flag = 0;
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
}
我正在尝试将内容从一个文件复制到另一个文件,使用 SIGINT 程序被中断以打印复制的字节数。我尝试在标志初始化、标志检查和标志清除时使用 sigprocmask 以避免竞争条件。但我不知道如何检查这个 sigprocmask 是否有效。为此,我找了好久。
void signal_handler(int num)
{
flag = 1;
}
int main()
{
signal(SIGINT, signal_handler);
ret = sigaddset(&set, SIGINT);
/* Code for
* copying the bytes from one file to another
*/
sigprocmask(SIG_BLOCK, &set, NULL);
if (flag == 1)
printf("The number of bytes copied are :%llu\n", bytes);
flag = 0;
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
}
它应该会如您所愿。您唯一需要确保的是 flag
是 volatile sig_atomic_t
类型以避免 flag
.
举个例子。循环连续打印 bytes
的值(它会在 bytes
达到 UINT64_MAX
的某个点回绕)。可以重复发送SIGINT
进行测试
#include <stdio.h>
#include <signal.h>
#include <inttypes.h>
volatile sig_atomic_t flag = 0;
void signal_handler(int num)
{
flag = 1;
}
int main(void)
{
uint64_t bytes = 0;
sigset_t set;
signal(SIGINT, signal_handler);
int ret = sigaddset(&set, SIGINT);
while(1) {
bytes++;
sigprocmask(SIG_BLOCK, &set, NULL);
if (flag == 1)
printf("The number of bytes copied are :%" PRIu64 "\n", bytes);
flag = 0;
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
}