рд╕рд┐рдЧреНрдирд▓ рдлрд╛рдЗрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░

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

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


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

рдирд┐рд░реНрдгрдп


рд╣рдо SIGUSR2 рдФрд░ SIGUSR1 рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ
SIGUSR2 - рд╢реВрдиреНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛, SIGUSR1 - рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╕рд╛ред

рдбреЗрдЯрд╛ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ

рдЪрд░ рд╕реА рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд╛рдЗрдЯ рдкрдврд╝реЗрдВред
рдХрд╛рдЙрдВрдЯрд░ рд╡реЗрд░рд┐рдПрдмрд▓ 0b10000000 рдпрд╛ 128 рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рдПрдВред
рдпрджрд┐ c рдФрд░ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдмрд┐рдЯ рд╡рд╛рдЗрдЬ рдФрд░") рдХрд╛рдЙрдВрдЯрд░ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд╣рдо SIGUSR1 рднреЗрдЬрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо SIGUSR2 рднреЗрдЬрддреЗ рд╣реИрдВред
рд╣рдо рдЖрдзреЗ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдореЗрдВ 0b01000000 рдпрд╛ 64 рдорд┐рд▓рддрд╛ рд╣реИ), рдпрд╛рдиреА рд╣рдо рдмрд╛рдИрдВ рдУрд░ рджреВрд╕рд░реЗ рдмрд┐рдЯ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред
рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рддрдХ рджреЛрд╣рд░рд╛рдПрдВред рдлрд┐рд░ рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирдИ рдмрд╛рдЗрдЯ рдкрдврд╝рддреЗ рд╣реИрдВред

рд╕реА рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
while (read(fd, &c, 1) > 0) { for ( i = 128; i >= 1; i /= 2) { if ( i & c ) // 1 kill(ppid, SIGUSR1); else // 0 kill(ppid, SIGUSR2); } 

рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд

рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓__рдЪрдХреНрд░ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╢реБрд░реВ рдореЗрдВ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ред
рдЬрдмрдХрд┐ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
рдпрджрд┐ SIGUSR1 рдЖрдпрд╛ рд╣реИ, рддреЛ out_char + = рдХрд╛рдЙрдВрдЯрд░ , рдлрд┐рд░ рдХрд╛рдЙрдВрдЯрд░ / = 2 ред
рдЕрдЧрд░ SIGUSR1 рдЖрдпрд╛, рддреЛ рдХрд╛рдЙрдВрдЯрд░ / = 2 ред

рд╣рдо рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ:
 // SIGUSR1 void one(int signo) { out_char += counter; counter /= 2; } // SIGUSR2 void zero(int signo) { counter/=2; } 

рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк


рдЕрдм рдЖрдкрдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдпрд╛ рдмрдЪреНрдЪреЗ рдХреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореМрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдмрдЪреНрдЪрд╛ рдорд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ SIGCHLD рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
 // SIGCHLD void childexit(int signo) { exit(EXIT_SUCCESS); } 

рдпрд╣ рдмрдЪреНрдЪреЗ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЗ рдХреЛ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдореГрддреНрдпреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд░реНрдиреЗрд▓ рд╕реЗ рд╣рдореЗрдВ SIGALRM рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЕрдиреНрдп рд╕рдВрдХреЗрдд рд╣рдореЗрдВ рдирд╣реАрдВ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 while (read(fd, &c, 1) > 0) { // SIGALRM          alarm(1); //   for ( i = 128; i >= 1; i /= 2) { if ( i & c ) // 1 kill(ppid, SIGUSR1); else // 0 kill(ppid, SIGUSR2); } } 

рдорд╛рддрд╛-рдкрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдЪреНрдЪреЗ рд╕реЗ рд╕рдВрдХреЗрдд рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдЬреЛрдбрд╝реЗрдВред рдпрд╣реА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдмрд┐рдЯ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХрд░рддреЗ, рддрдм рддрдХ рдмрдЪреНрдЪрд╛ рдЕрдЧрд▓реЗ рдПрдХ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рд╢реВрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдПрдХ рд╕рдВрдХреЗрдд SIGUSR1 рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВрдЧреЗ ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:
 // SIGUSR1 void one(int signo) { out_char += counter; counter /= 2; kill(pid, SIGUSR1); } // SIGUSR2 void zero(int signo) { counter/=2; kill(pid, SIGUSR1); } 

рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, sigsuspend (рдФрд░ рд╕реЗрдЯ) рдЬреЛрдбрд╝реЗрдВ:
 while (read(fd, &c, 1) > 0){ // SIGALRM          alarm(1); //   for ( i = 128; i >= 1; i /= 2){ if ( i & c ) // 1 kill(ppid, SIGUSR1); else // 0 kill(ppid, SIGUSR2); //      //     sigsuspend(&set); } 

рдкреИрд░реЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдХрдиреНрдлрд░реНрдореЗрд╢рди рд╕рд┐рдЧреНрдирд▓ рдЖрдиреЗ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрдВрдХреНрд╢рди, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЦрд╛рд▓реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╣реАрдВ рддреЛ рдбрд┐рдлреЙрд▓реНрдЯ рд╕рд┐рдЧреНрдирд▓, рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╢рди рдкрд░рдлреЙрд░реНрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдп рдФрд░ рд╕реЗрдЯ :
 // Nothing void empty(int signo) { } // SET sigemptyset(&set); //    // SIGUSR1 - empty() struct sigaction act_empty; memset(&act_empty, 0, sizeof(act_empty)); act_empty.sa_handler = empty; sigfillset(&act_empty.sa_mask); sigaction(SIGUSR1, &act_empty, NULL); // SIGALRM - parentexit() struct sigaction act_alarm; memset(&act_alarm, 0, sizeof(act_alarm)); act_alarm.sa_handler = parentexit; sigfillset(&act_alarm.sa_mask); sigaction(SIGALRM, &act_alarm, NULL); 

рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ, рд╕рд┐рдЧреНрдирд▓ рдорд╛рд╕реНрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
 // SIGCHLD - exit struct sigaction act_exit; memset(&act_exit, 0, sizeof(act_exit)); act_exit.sa_handler = childexit; sigfillset(&act_exit.sa_mask); sigaction(SIGCHLD, &act_exit, NULL); // SIGUSR1 - one() struct sigaction act_one; memset(&act_one, 0, sizeof(act_one)); act_one.sa_handler = one; sigfillset(&act_one.sa_mask); sigaction(SIGUSR1, &act_one, NULL); // SIGUSR2 - zero() struct sigaction act_zero; memset(&act_zero, 0, sizeof(act_zero)); act_zero.sa_handler = zero; sigfillset(&act_zero.sa_mask); sigaction(SIGUSR2, &act_zero, NULL); //   sigaddset(&set, SIGUSR1); sigaddset(&set, SIGUSR2); sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, NULL ); 

рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА, рдЬреЛ рддреБрд░рдВрдд рд╣рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ (рдбреЗрдЯрд╛), рд╕рд┐рдЧрдкреНрд░реЛрдореИрдХреНрд╕ (SIG_BLOCK, рдФрд░ рд╕реЗрдЯ, NULL) рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреА рд╣реИ, рдХрд╛рдВрдЯреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рджреМрдбрд╝ рдкреНрд░рднрд╛рд╡ (рджреМрдбрд╝) рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ рд╣рд╛рд▓рдд)ред
рдирддреАрдЬрддрди, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 int out_char = 0, counter = 128; pid_t pid; //      // SIGCHLD void childexit(int signo) { exit(EXIT_SUCCESS); } // SIGALRM void parentexit(int signo) { exit(EXIT_SUCCESS); } // Nothing void empty(int signo) { } // SIGUSR1 void one(int signo) { out_char += counter; counter /= 2; kill(pid, SIGUSR1); } // SIGUSR2 void zero(int signo) { counter/=2; kill(pid, SIGUSR1); } int main(int argc, char ** argv){ if (argc != 2) { fprintf(stderr, "Use: %s [source]\n", argv[0]); exit(EXIT_FAILURE); } pid_t ppid = getpid(); //   ,    sigset_t set; //     //  SIGCHLD -  struct sigaction act_exit; memset(&act_exit, 0, sizeof(act_exit)); act_exit.sa_handler = childexit; sigfillset(&act_exit.sa_mask); sigaction(SIGCHLD, &act_exit, NULL); // SIGUSR1 - one() struct sigaction act_one; memset(&act_one, 0, sizeof(act_one)); act_one.sa_handler = one; sigfillset(&act_one.sa_mask); sigaction(SIGUSR1, &act_one, NULL); // SIGUSR2 - zero() struct sigaction act_zero; memset(&act_zero, 0, sizeof(act_zero)); act_zero.sa_handler = zero; sigfillset(&act_zero.sa_mask); sigaction(SIGUSR2, &act_zero, NULL); //sigemptyset(&set); //   sigaddset(&set, SIGUSR1); sigaddset(&set, SIGUSR2); sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, NULL ); sigemptyset(&set); //  pid = fork(); //  () if (pid == 0) { unsigned int fd = 0; char c = 0; sigemptyset(&set); //    // SIGUSR1 - empty() struct sigaction act_empty; memset(&act_empty, 0, sizeof(act_empty)); act_empty.sa_handler = empty; sigfillset(&act_empty.sa_mask); sigaction(SIGUSR1, &act_empty, NULL); // SIGALRM - parentexit() struct sigaction act_alarm; memset(&act_alarm, 0, sizeof(act_alarm)); act_alarm.sa_handler = parentexit; sigfillset(&act_alarm.sa_mask); sigaction(SIGALRM, &act_alarm, NULL); if ((fd = open(argv[1], O_RDONLY)) < 0 ){ perror("Can't open file"); exit(EXIT_FAILURE); } int i; while (read(fd, &c, 1) > 0){ // SIGALRM          alarm(1); //   for ( i = 128; i >= 1; i /= 2){ if ( i & c ) // 1 kill(ppid, SIGUSR1); else // 0 kill(ppid, SIGUSR2); //     //      sigsuspend(&set); } } //   exit(EXIT_SUCCESS); } errno = 0; //      do { if(counter == 0){ // Whole byte write(STDOUT_FILENO, &out_char, 1); // fflush(stdout); counter=128; out_char = 0; } sigsuspend(&set); //     } while (1); exit(EXIT_SUCCESS); } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles