рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реИрдХреНрдЯрд┐рд╕

рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрднрд╡ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВред рдореИрдВ рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд▓рдорд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрдирд╛ рдФрд░ рдпрд╛рдж рд░рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рд╣реЛ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдп:

рдореИрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рддрд▓реНрд▓реАрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВ рдФрд░ рдХрд╣рд╛рдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрдВрддреНрд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХреЗрдд SIGUSR1 рдФрд░ SIGUSR2 рд╣реЛрдВрдЧреЗ, рдпреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреВрд░реНрдг рдирд┐рдкрдЯрд╛рди рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдХреЗрд╡рд▓ рджреЛ рд╕рдВрдХреЗрдд рд╣реИрдВред рдФрд░ рдпрд╣ рднреА рдХрд┐ рдореИрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреА рдЕрдВрддрд░-рд╕реВрддреНрд░реАрдп рдмрд╛рддрдЪреАрдд рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред

рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди


рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдпрд╛ рдереНрд░реЗрдб) рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдереНрд░реЗрдб) рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рд╣рдорд╛рд░реЗ рд╣рд┐рдд рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рд╕рддрд░реНрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧреЗ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреИрдпрд╛рд░реА рдХреЗ рдХрд╛рдо рдореЗрдВ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБрдПрдВ рдЕрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд▓реЗрдЦрдХ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рджреЗрдиреЗ рдХрд╛ рдЙрдкрдХреНрд░рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЦреБрдж рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ рдХреЛрдмреЛрд▓реЛрдЧ рдХреА рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВ) рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ FAQ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред
void hdl(int sig) { exit = true; } 

рдирдпрд╛ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВред
 sighandler_t signal(int signum, sighandler_t handler); 

рдЬреЛ рд╕рд┐рдЧреНрдирд▓ рдирдВрдмрд░, рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ (рдпрд╛ SIG_IGN (рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ) рдпрд╛ SIG_DFL (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░)) рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред SIGKILL рдФрд░ SIGSTOP рд╕рд┐рдЧреНрдирд▓ "рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб" рдпрд╛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:

рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЗрди рдХрдорд┐рдпреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ
 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 

рдЬреЛ рдПрдХ рд╕рдВрдХреЗрдд рд╕рдВрдЦреНрдпрд╛ (SIGKILL рдФрд░ SIGSTOP рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рддреАрд╕рд░рд╛ рдорд╛рди рдкреБрд░рд╛рдирд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕рд┐рдЧрдиреЗрд╢рди рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд┐рдореНрди рд░реБрдЪрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред
 struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = hdl; sigset_t set; sigemptyset(&set); sigaddset(&set, SIGUSR1); sigaddset(&set, SIGUSR2); act.sa_mask = set; sigaction(SIGUSR1, &act, 0); sigaction(SIGUSR2, &act, 0); 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рд╕рд┐рдЧреНрдирд▓ SIGUSR1 рдФрд░ SUGUSR2 рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рднреА рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рд╕рдордп рдЙрд╕реА рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдФрд░ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЙрддреНрдкрдиреНрди рдзрд╛рдЧреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╕рдВрдХреЗрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рдереНрд░реЗрдб (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡) рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрдХреЗрдд рдПрдХ рдзрд╛рдЧреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 1 рджреЗрдЦреЗрдВ ред

рд╕рд┐рдЧреНрдирд▓ рдмреНрд▓реЙрдХ рдХрд░рдирд╛


рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

рд╣рдо рдореМрдЬреВрджрд╛ рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ рдореЗрдВ рдирдП рд╕рд┐рдЧреНрдирд▓ (SIG_BLOCK) рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рдорд╛рд╕реНрдХ рд╕реЗ рд╕рд┐рдЧреНрдирд▓ (SIG_UNBLOCK) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ (SIG_SETMASK) рдХреЛ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдереНрд░реЗрдб рдХреЗ рдЕрдВрджрд░ рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); 

рдЬреЛ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗред
рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде SIGKILL рдпрд╛ SIGSTOP рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

sigwait


рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд┐рдЧреНрдирд▓ (рдпрд╛ рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ рдореЗрдВ рд╕реЗ рдПрдХ) рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдпрд╛ рдереНрд░реЗрдб) рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг 2 рджреЗрдЦреЗрдВ ред

рд╕рдВрдХреЗрдд рднреЗрдЬрдирд╛


рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрдХреЗрдд рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
 int kill(pid_t pid, int sig); int raise(int sig); 

рдкрд╣рд▓реЗ рд╕реЗ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЦреБрдж рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ (рдЧреЗрдЯрдкрд┐рдб (), рд╕рд┐рдЧреНрдирд▓)ред рдЧреЗрдЯрдкрд┐рдб () рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреАрдЖрдИрдбреА тАЛтАЛрдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдХрд┐рд╕реА рдПрдХ рд╕реВрддреНрд░ рдХреЛ рд╕рдВрдХреЗрдд рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 int pthread_kill(pthread_t thread, int sig); 


рд╕рдВрдХреЗрдд рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг


рдЬреЛ рдХреБрдЫ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ "рдореБрдЭреЗ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"ред рдЕрдм рдореИрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдмрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдпрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрдврд╝рдирд╛ред рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдкрд╛рдЗрдк рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ред рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ? рдПрдХ рдЕрд╡рд░реБрджреНрдз IO рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░реЗрдВ? рдЖрдк рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдзрди рд╣реИрдВ: рдЫрджреНрдо рдФрд░ ppoll рдлрд╝рдВрдХреНрд╢рдВрд╕ред рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдпреЛрдЬреНрдп рдореЗрдВ рд╣реИ, рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, IO (рдЪрдпрди / рдкреЛрд▓) рдХреЗ рд╕рд╛рде рдмрд╣реБрд╕рдВрдХреЗрддрди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ 'рдкреА' рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ, рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдПрдХ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ (рдпреВрдбреАрдкреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП) рдФрд░ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдмрд┐рдирд╛ рджреЗрд░реА рдХрд┐рдП рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдереНрд░реЗрдб рдлрд╝рдВрдХреНрд╢рди рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
 void* blocking_read(void* arg) { if(stop) { //   ,     ? std::cout << "Thread was aborted\n"; pthread_exit((void *)0); } //   SIGINT sigset_t set, orig; sigemptyset(&set); sigaddset(&set, SIGINT); sigemptyset(&orig); pthread_sigmask(SIG_BLOCK, &set, &orig); if(stop) { //         //       std::cout << "Thread was aborted\n"; pthread_sigmask(SIG_SETMASK, &orig, 0); pthread_exit((void *)0); } //       SIGINT std::cout << "Start thread to blocking read\n"; // ... // ,  ,    ppoll ppoll((struct pollfd*) &clients, 1, NULL, &orig); if(stop) { //      std::cout << "Thread was aborted\n"; close(sockfd); pthread_sigmask(SIG_SETMASK, &orig, 0); //   SIGINT    } //    ,    .     //        " " close(sockfd); pthread_exit((void *)0); } 

рд╕реНрдЯреЙрдк рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдмреБрд▓рд┐рдпрди рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ рдзрд╛рдЧреЗ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ:

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИ
 int main() { ... struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = hdl; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGINT); sigaction(SIGINT, &act, 0); ... pthread_kill(th1, SIGINT); ... } 

рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ SIGINT рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдмрдЪреНрдЪреЗ рдХреЗ рдзрд╛рдЧреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЙрд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рднреЗрдЬрддреЗ рд╣реИрдВред
рд╕рдВрдкреВрд░реНрдг рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ ред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реНрдг рдЕрдВрддрд░-рдереНрд░реЗрдбреЗрдб рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд▓рд┐рдирдХреНрд╕ рддрд░реАрдХрд╛ рдпрд╣ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪред рдореИрдВрдиреЗ рдкреЗрд╕реНрдЯрдмрд┐рди рд╕реЗрд╡рд╛ рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рд░рдЦрд╛ (рдореИрдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рджреЗрддрд╛, рдЕрдиреНрдпрдерд╛ рд╡реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ)ред
рдкреА рдкреА рдПрд╕ред рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкреНрд░рдЪреБрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рднрд╛рд╖рд╛, рдореЗрд░рд╛ рдХрдордЬреЛрд░ рдкрдХреНрд╖ред рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред



рдпрд╣ рд▓реЗрдЦ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреВрд░реНрдг (рдФрд░ рдЧрд╣рд░рд╛) рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ рдЬреЛ рдЗрд╕ рдХреНрд╖рдг рддрдХ "рд╕рд┐рдЧреНрдирд▓" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХ рдЕрдзрд┐рдХ рд╕рдХреНрд╖рдо рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In141206/


All Articles