#include <unistd.h> /* GLIBC */
long int TEMP_FAILURE_RETRY(expression);
ΠΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΡΠ°:
/* ΠΡΠ΅Π½ΠΈΡΡ EXPRESSION ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1 Ρ 'errno',
ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ Π² EINTR. */
# define TEMP_FAILURE_RETRY(expression) \
(__extension__ \
({ long int __result; \
do __result = (long int)(expression); \
while (__result == -1L && errno == EINTR); \
__result; }))
ΠΠ°ΠΊΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ GCC ΠΊ ΡΠ·ΡΠΊΡ Π‘ (ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ __extension__), ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ Π² ΡΠΈΠ³ΡΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΎΠΊ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΄Π΅ΠΉΡΡΠ²ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΎΡΡΠΎΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΌΠ°ΠΊΡΠΎΡ, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ safe_read() ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
size_t safe_read(int fd, void const *buf, size_t count) {
ssize_t result;
/* ΠΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ count, ΠΊΠ°ΠΊ Π² ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. */
if (count > INT_MAX)
count = INT_MAX & ~8191;
result = TEMP_FAILURE_RETRY(read(fd, buf, count));
return (size_t)result;
}
10.4.5. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π³ΠΎΠ½ΠΎΠΊ ΠΈ sig_atomic_t (ISO C)
ΠΠΎΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Π·Π° ΡΠ°Π· Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΎΡΡΠΎ: ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° Π² main() ΠΈ (Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ) ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ΅Π±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π° (ΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ SIG_IGN) Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ Π΄Π²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΡΠΈΠ³Π½Π°Π»Π°, ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ? Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°, Π° Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠ³Π½Π°Π» ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, Π½ΠΎ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ΅Π±Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ?
ΠΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ bsd_signal(), ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ, Π½ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠ³Π½Π°Π» ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ? ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ, Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΡΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ!
ΠΠ±Π° ΡΠ»ΡΡΠ°Ρ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π³ΠΎΠ½ΠΊΠΈ. ΠΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅Π΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠΎΠ·Π΄Π°Π² ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠ΅ Π½Π° ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² true ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ. ΠΠ°ΡΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ»Π°Π³ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ :
int sig_int_flag = 0; /* ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π² true */
void int_handler(int signum) {
sig_int_flag = 1;
}
int main(int argc, char **argv) {
bsd_signal(SIGINT, int_handler);
/* ...ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ... */
if (sig_int_flag) {
/* Π²ΠΎΠ·Π½ΠΈΠΊ SIGINT, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ */
}
/* ...ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ°... */
}
(ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΎΠΊΠ½ΠΎ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, Π½ΠΎ Π½Π΅ ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π΅Π³ΠΎ).
Π‘ΡΠ°Π½Π΄Π°ΡΡ Π‘ Π²Π²ΠΎΠ΄ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ β sig_atomic_t β Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠ»Π°Π³ΠΎΠ²ΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ. ΠΠ΄Π΅Ρ, ΡΠΊΡΡΠ²Π°ΡΡΠ°ΡΡΡ Π·Π° ΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ: Ρ.Π΅. ΠΎΠ½ΠΈ ΡΠΎΠ²Π΅ΡΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ Π΄Π΅Π»ΠΈΠΌΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΌΠ°ΡΠΈΠ½ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ int ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΡΡΡΠΊΡΡΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ Π±Π°ΠΉΡΠΎΠ² Π² (ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ) ΡΠΈΠΊΠ»Π΅, Π»ΠΈΠ±ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Β«Π±Π»ΠΎΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ», ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½Π°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ sig_atomic_t ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌ, ΡΠ°Π· Π½Π°ΡΠ°Π²ΡΠΈΡΡ, ΠΎΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠ³Π½Π°Π» ΠΈ ΠΏΡΠ΅ΡΠ²Π°ΡΡ Π΅Π³ΠΎ.
ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΡΠ°ΡΡΡΡ ΠΈΡΡΠΎΡΠΈΠΈ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ sig_atomic_t Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΠΊΠ°ΠΊ volatile:
volatile sig_atomic_t sig_int_flag = 0; /* ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π² true */
/* ...ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ ΡΠ°Π½ΡΡΠ΅... */
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ volatile ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΈΠ·Π²Π½Π΅, Π·Π° ΡΠΏΠΈΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°, ΡΠ°ΠΊ ΡΠΊΠ°Π·Π°ΡΡ. ΠΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠ³Π»Π° Π±Ρ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠ΄Π°
Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΎΠΊΡΡΠ³ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ sig_atomic_t Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π°Π»Π΅Π΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 10.7 Β«Π‘ΠΈΠ³Π½Π°Π»Ρ Π΄Π»Ρ ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡΒ».
10.4.6. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΡ
Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠΉ:
β’ Π§ΡΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ SIGFPE, SIGILL, SIGSEGV ΠΈΠ»ΠΈ Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΡ Β«Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ», Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ.
β’ ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° abort(), raise() ΠΈΠ»ΠΈ kill(), ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ raise(). abort() ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 12.4 Β«Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΠ±ΠΈΠΉΡΡΠ²Π°: abort()Β», a kill() ΠΎΠΏΠΈΡΠ°Π½Π° Π΄Π°Π»Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅. (ΠΠΏΠΈΡΠ°Π½Π½Π°Ρ Π΄Π°Π»Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΡ API sigaction() Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ ΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎΠ± ΡΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ.)
β’ ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΡΠ·Π²Π°ΡΡ Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΡΠ°Π±Π». 10.2. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ <stdio.h>. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ <stdio.h> ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΉ <stdio.h> ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈΡΡ ΡΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
Π‘ΠΏΠΈΡΠΎΠΊ Π² ΡΠ°Π±Π». 10.2 ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° 2.4 ΡΠΎΠΌΠ° System Interfaces (Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ) ΡΡΠ°Π½Π΄Π°ΡΡΠ° POSIX 2001. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎΠΌΡ API ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅.
Π’Π°Π±Π»ΠΈΡΠ° 10.2. Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°
_Exit() fpathconf() raise() sigqueue() _exit() fstat() read() sigset() accept() fsync() readlink() sigsuspend() access() ftruncate() recv() sleep() aio_error() getegid() recvfrom() socket() aio_return() geteuid() recvmsg() socketpair() aio_suspend() getgid() rename() stat() alarm() getgroups() rmdir() sysmlink() bind() getpeername() select() sysconf() cfgetispeed() getpgrp() sem_post() tcdrain() cfgetospeed() getpid() send() tcflow() cfsetispeed() getppid() sendmsg() tcflush() cfsetospeed() getsockname() sendto() tcgetattr() chdir() getsockopt() setgid() tcgetpgrp() chmod() getuid() setpgid() tcsendbreak() chown() kill() setsid() tcsetattr() clock_gettime() link() setsockopt() tcsetpgrp() close() listen() setuid() time() connect() lseek() shutdown() timer_getoverrun() creat() lstat() sigaction() timer_gettime() dup() mkdir() sigaddset() timer_settime() dup2() mkfifo() sigdelset() times() execle() open() sigemptyset() umask() execve() pathconf() sigfillset() uname() fchmod() pause() sigismember() unlink() fchown() pipe() signal() utime() fcntl() poll() sigpause() wait() fdatasync() posix_trace_event() sigpending() waitpid() fork() pselect() sigprocmask() write()10.4.7. ΠΠ°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π΄ΠΎ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΏΠΈΠ·ΠΎΠ΄ 1