По сигналам в C программировании - PullRequest
1 голос
/ 23 января 2020

Я читаю стандарт C11 ISO, и мне трудно понять пункт, касающийся сигналов.

В частности, раздел 5 в разделе 5.1.2.3, описывающий выполнение программ на абстрактной машине:

Когда обработка абстрактной машины прерывается при получении сигнала, значения объектов, которые не являются ни объектами атома без блокировки c, ни типом volatile sig_atomic_t, не определены, как и состояние с плавающей запятой окружающая обстановка. Значение любого объекта, измененного обработчиком, который не является ни объектом atomi c без блокировки, ни типом volatile sig_atomic_t, становится неопределенным при выходе из обработчика, как и состояние среды с плавающей запятой, если оно изменяется обработчиком и не восстанавливается в исходное состояние.

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

1 Ответ

0 голосов
/ 24 января 2020

Это относится только к переменным, которые используются как в обработчике сигнала, так и вне его.

Любые другие переменные (не используемые в обработчике или используемые только в обработчике) являются безопасными (определенными).

Например, допустим, у вас есть глобальная переменная, которая используется внутри обработчика сигнала и в другой функции, чем эта переменная должна быть либо volatile-неблокируемой atomi c переменная, либо volatile sig_atomic_t.

Any переменные из других разделяемых типов переменных могут действительно быть неопределенными. Например, если это было изменено обработчиком, старое значение могло бы все еще использоваться в функции, которую мы остановили в середине, однако возможно, что будет использоваться новое значение (в non atomi c возможно, может быть использована некая комбинация - что может быть полной чепухой), как и сказано, это будет неопределенным Предположим, что вы должны использовать Atom c, когда это необходимо. Var должен быть volatile, так как используется в середине функции, см. { ссылка }.

...