Как бороться с errno и обработчиком сигналов в Linux?

Когда мы пишем обработчик сигнала, который может изменить errno, должны ли мы сохранять errno в начале обработчика сигнала и восстанавливать errno в конце? Как показано ниже:

void signal_handler(int signo){
    int temp_errno = errno;
    *** //code here may change the errno
    errno = temp_errno;
}

person cong    schedule 22.01.2018    source источник


Ответы (1)


Документация glibc говорит:

обработчики сигналов, которые вызывают функции, которые могут установить errno или изменить среду с плавающей запятой, должны сохранять свои исходные значения и восстанавливать их перед возвратом.

Так что давай, сделай это.

Если вы пишете многопоточную программу с использованием pthreads, существует обходной путь, требующий меньших усилий. errno будет находиться в локальном хранилище потока. Если вы выделяете один поток для обработки сигналов, направленных на процесс, блокируя сигнал во всех других потоках, вам не нужно беспокоиться о назначениях errno в обработчике сигналов.

person Mark Plotnick    schedule 22.01.2018
comment
Почему почти все обработчики сигналов не сохраняют errno и не восстанавливают его в однопоточном процессе? Потому что эти программисты просто не учитывают это? - person cong; 01.02.2018