Как замаскировать сигнал, когда я обрабатываю переменную в signal _handler и в основной функции - PullRequest
2 голосов
/ 25 мая 2020

Я пытаюсь скопировать содержимое из одного файла в другой, при использовании 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);
    }
}

1 Ответ

1 голос
/ 25 мая 2020

Он должен работать так, как вы ожидаете. Единственное, что вам нужно убедиться, это то, что flag имеет тип volatile sig_atomic_t, чтобы избежать гонки данных на flag.

Вот пример. L oop печатает значение 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);
    }
}
...