
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдУрдПрд╕ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЬреАрд╡рди рдкрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдорд░ рдЬрд╛рддреА рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдЖрд▓реЗрдЦ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЬреЛ рд▓реЛрдЧ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рд╕рдм рдХреБрдЫ 4.15.0 рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдбреЗрдмрд┐рдпрди рд▓рд┐рдирдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА
- рдкрд░рд┐рдЪрдп
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреАрд╡рди рдЪрдХреНрд░
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрдиреНрдо
- рддреИрдпрд╛рд░ рдЕрд╡рд╕реНрдерд╛
- рд╕реНрдерд┐рддрд┐ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ
- рдПрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреБрдирд░реНрдЬрдиреНрдо
- рд▓рдВрдмрд┐рдд рдЕрд╡рд╕реНрдерд╛
- рд╕реНрдерд┐рддрд┐ рдмрдВрдж рдХрд░реЛ
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛ рд░рд╣реА рд╣реИ
- "рд▓рд╛рд╢" рдХреА рд╕реНрдерд┐рддрд┐
- рдмреЗрд╣реЛрд╢реА
- рдзрдиреНрдпрд╡рд╛рдж
рдкрд░рд┐рдЪрдп
рд╕рд┐рд╕реНрдЯрдо рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ред рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрдкреАрдЖрдИ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП, рдЦрд░реАрдж рдпрд╛ рд╕рдлрд╝реНрд╕ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ
рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
рдпрд╣рд╛рдВ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА
рд╣реИ )ред
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд▓реЗрдЦ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рдФрд░ рдХрд░реНрдиреЗрд▓ рд╡рд┐рдХрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреБрдЫ рд╣рдж рддрдХ рдЕрдореВрд░реНрдд рд╣реИрдВ рдФрд░ рдмрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА (рдкреАрдЖрдИрдбреА)
- рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрд┐рдХрд╛рдПрдБ рдЦреЛрд▓реЗрдВ (fd)
- рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░реНрд╕
- рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (cwd)
- рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ (рдкрд░реНрдпрд╛рд╡рд░рдг)
- рд░рд┐рдЯрд░реНрди рдХреЛрдб
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреАрд╡рди рдЪрдХреНрд░

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрдиреНрдо
рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ -
init
- рдпрд╣ рд╕реАрдзреЗ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ
fork(2)
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдХреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВред
fork(2)
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рджреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдорд┐рд▓рддреА рд╣реИрдВ:
fork(2)
рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдмрдЪреНрдЪреЗ рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛрд▓реМрдЯрд╛рддрд╛ рд╣реИ, 0 рдмрдЪреНрдЪреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;- рдмрдЪреНрдЪрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкреАрдЖрдИрдбреА тАЛтАЛ(рдкреЗрд░реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕ рдЖрдИрдбреА) рдХреЛ рдкреАрдЖрдИрдбреА тАЛтАЛрдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред
fork(2)
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрди рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИрдВред рдореЗрдореЛрд░реА рдХреЗ рд╕рднреА рдЖрд╡рдВрдЯрд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдпрд╛рдж рдореЗрдВ рд╕рднреА рдкреГрд╖реНрда рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреГрд╖реНрда рдкрд░ рдбреЗрдЯрд╛ рдмрджрд▓рддреА рд╣реИ, рдпрд╣ рдкреГрд╖реНрда рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдкреА рдФрд░ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореВрд▓ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ "рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд" рд╣реИред рдЬреИрд╕реЗ рд╣реА рд░реАрдб-рдУрдирд▓реА рдУрд░рд┐рдЬрд┐рдирд▓ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП "рдмрд╛рдЙрдВрдб" рд░рд╣рддрд╛ рд╣реИ, рдкреЗрдЬ рдХреЛ рд░реАрдб-рд░рд╛рдЗрдЯ рд╕реНрдЯреЗрдЯрд╕ рдкрд░ рд░рд┐рдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╛рдВрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдмреЗрдХрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг (2) #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/wait.h> #include <sys/types.h> int main() { int pid = fork(); switch(pid) { case -1: perror("fork"); return -1; case 0: // Child printf("my pid = %i, returned pid = %i\n", getpid(), pid); break; default: // Parent printf("my pid = %i, returned pid = %i\n", getpid(), pid); break; } return 0; }
$ gcc test.c && ./a.out my pid = 15594, returned pid = 15595 my pid = 15595, returned pid = 0
рддреИрдпрд╛рд░ рдЕрд╡рд╕реНрдерд╛
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж,
fork(2)
рддреИрдпрд╛рд░ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрддрд╛рд░ рдореЗрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЪрд▓рдиреЗ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЕрдиреБрд╕реВрдЪрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреА рд╣реИред
рд╕реНрдерд┐рддрд┐ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ
рдЬреИрд╕реЗ рд╣реА рдЕрдиреБрд╕реВрдЪрдХ рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХреА, "рдЪрд╛рд▓реВ" рд╕реНрдерд┐рддрд┐ рд╢реБрд░реВ рд╣реЛ рдЧрдИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХреА рдкреВрд░реА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрд╡рдзрд┐ (рдХреНрд╡рд╛рдВрдЯрдо) рдЪрд▓рд╛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдпрд╣
sched_yield
рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд░рд╛рд╕реНрддрд╛ рджреЗ рд╕рдХрддреА рд╣реИред
рдПрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреБрдирд░реНрдЬрдиреНрдо
рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдо рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдЪреНрдЪреЗ рдХреЛ рдкреИрджрд╛ рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрдЪреНрдЪрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЛ рдХрд╛рд░реНрдп рд╕реМрдВрдкрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдПрдХ рдмрдЪреНрдЪрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ
execve(2)
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛:
int execve(const char *filename, char *const argv[], char *const envp[]);
рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЙрд▓
execl(3), execlp(3), execle(3), execv(3), execvp(3), execvpe(3)
:
int execl(const char *path, const char *arg, ... ); int execlp(const char *file, const char *arg, ... ); int execle(const char *path, const char *arg, ... ); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]);
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЙрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрде рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореВрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рдХреЗрд╡рд▓
O_CLOEXEC
рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝рд╛рдЗрд▓
O_CLOEXEC
, рд╡реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рдХреИрд╕реЗ рдЗрди рд╕рднреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдореЗрдВ рднреНрд░рдорд┐рдд рди рд╣реЛрдВ рдФрд░ рд╕рд╣реА рдХреЛ рдЪреБрдиреЗрдВ? рдпрд╣ рдирд╛рдордХрд░рдг рддрд░реНрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
- рд╕рднреА рдХреЙрд▓
exec
рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ - рдкрд╛рдБрдЪрд╡рд╛рдБ рдЕрдХреНрд╖рд░ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
- рдПрд▓ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ, рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ
arg1, arg2, ..., NULL
- v рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ, рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕рд░рдгреА рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ;
- рдкрддреНрд░ рдкреА , рдЬреЛ рдкрде рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ , рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐
file
рддрд░реНрдХ "/" рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ file
рдХреЛ PATHIST рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдирд┐рдЯрд╕ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓ рдореЗрдВ, рдЕрдВрддрд┐рдо рддрд░реНрдХ рдлреЙрд░реНрдо
key=value
- рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕рд░рдгреА рд╣реИ рдЬреЛ рдирдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП / рдмрд┐рди / рдмрд┐рд▓реНрд▓реА --help рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ #define _GNU_SOURCE #include <unistd.h> int main() { char* args[] = { "/bin/cat", "--help", NULL }; execve("/bin/cat", args, environ); // Unreachable return 1; }
$ gcc test.c && ./a.out Usage: /bin/cat [OPTION]... [FILE]... Concatenate FILE(s) to standard output. * *
exec*
рдХреЙрд▓ рдкрд░рд┐рд╡рд╛рд░ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдФрд░ рд╢реЗрдмрд╛рдВрдЧ (#!) рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдЧреНрдЬрд╛рдореНрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЦрд░рд╛рдм рдкреИрде рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг #define _GNU_SOURCE #include <unistd.h> int main() { char* e[] = {"PATH=/habr:/rulez", NULL}; execle("/tmp/test.sh", "test.sh", NULL, e); // Unreachable return 1; }
$ cat test.sh
рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ argv [0] рдирд┐рд╖реНрдкрд╛рджрди * рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрдд рддрд░реНрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдЬрдм рдмрд┐рд▓реНрд▓реА рдХреБрддреНрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛ рдЬрд╛рддреА рд╣реИ #define _GNU_SOURCE #include <unistd.h> int main() { execlp("cat", "dog", "--help", NULL); // Unreachable return 1; }
$ gcc test.c && ./a.out Usage: dog [OPTION]... [FILE]... * *
рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдкрд╛рдардХ рдпрд╣ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
int main(int argc, char* argv[])
рдлрд╝рдВрдХреНрд╢рди
int main(int argc, char* argv[])
рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ - рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ
exec*
рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреБрдЫ рднреА рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рддреБрд░рдВрдд рдореБрдЦреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, glibc рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧрд┐рдирддреА argc рд╢рд╛рдорд┐рд▓ рд╣реИред
рд▓рдВрдмрд┐рдд рдЕрд╡рд╕реНрдерд╛
рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ I / Oред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ "рд▓рдВрдмрд┐рдд" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓реА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "рддреИрдпрд╛рд░" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред
рд▓рд┐рдирдХреНрд╕ рдкрд░, рдПрдХ "рдкреНрд░рддреАрдХреНрд╖рд╛" рд╕реНрдерд┐рддрд┐ рднреА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд░реБрдХрд╛рд╡рдЯ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рдЕрд╡рд┐рдирд╛рд╢реА" рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕рднреА рдЖрд╡рдХ рд╕рдВрдХреЗрдд рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рддрдХ рдХрддрд╛рд░ рдореЗрдВ рдЦрдбрд╝реЗ рд░рд╣рддреЗ рд╣реИрдВред
рдХрд░реНрдиреЗрд▓ рд╣реА рдЪреБрдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬреНрдпрд╛рджрд╛рддрд░, I / O рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ "рдкреНрд░рддреАрдХреНрд╖рд╛ (рдмрд┐рдирд╛ рд░реБрдХрд╛рд╡рдЯ рдХреЗ)" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╣реА рддреЗрдЬрд╝ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде рд░рд┐рдореЛрдЯ рдбрд┐рд╕реНрдХ (NFS) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рд╕реНрдерд┐рддрд┐ рдмрдВрдж рдХрд░реЛ
рдЖрдк рдЗрд╕реЗ SIGSTOP рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрдХрд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ "рд░реБрдХреА рд╣реБрдИ" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓реА рдЬрд╛рдПрдЧреА рдФрд░ рддрдм рддрдХ рд╡рд╣рд╛рдВ рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЙрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ (SIGCONT) рдпрд╛ рдбрд╛рдИ (SIGKILL) рдХрд╛ рд╕рдВрдХреЗрдд рди рдорд┐рд▓ рдЬрд╛рдПред рд╢реЗрд╖ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛ рд░рд╣реА рд╣реИ
рдХреЛрдИ рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдЦреБрдж рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдХреЗрд╡рд▓
_exit
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рдЖрдк
main()
рд╕реЗ рдПрдХ рдирдВрдмрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ
main()
,
_exit
рдХреЛ рдЕрднреА рднреА рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рддрд░реНрдХ рдЕрдВрддрд░ рд╣реИ, рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдХрдо рдмрд╛рдЗрдЯ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
"рд▓рд╛рд╢" рдХреА рд╕реНрдерд┐рддрд┐
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ), рдХрд░реНрдиреЗрд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдИ рдФрд░ рдЗрд╕реЗ "рдЬрд╝реЛрдВрдмреА" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдЬрд╝реЛрдВрдмреА рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕реНрдореГрддрд┐ рдЕрднреА рднреА рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреВрд╕рд░рд╛ рд░рд╛рдЬреНрдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGKILL рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдорд░ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред
рдмреЗрд╣реЛрд╢реА
рд░рд┐рдЯрд░реНрди рдХреЛрдб рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдЕрднреА рднреА рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдкрдпреБрдХреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
pid_t wait(int *wstatus); pid_t waitpid(pid_t pid, int *wstatus, int options);
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЗрдВрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИред
waitpid(2)
рдореИрди рдкреЗрдЬ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╣реА рд╕рдорд╛рдкрди рдФрд░ рд╡рд╛рдкрд╕реА рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/wait.h> #include <sys/types.h> int main() { int pid = fork(); switch(pid) { case -1: perror("fork"); return -1; case 0: // Child return 13; default: { // Parent int status; waitpid(pid, &status, 0); printf("exit normally? %s\n", (WIFEXITED(status) ? "true" : "false")); printf("child exitcode = %i\n", WEXITSTATUS(status)); break; } } return 0; }
$ gcc test.c && ./a.out exit normally? true child exitcode = 13
рдЧрд▓рдд рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдгрдХрд┐рд╕реА рджреБрд░реНрдШрдЯрдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ argv [0] рдкрд╛рд╕ рдХрд░рдирд╛ред
#include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/wait.h> #include <sys/types.h> int main() { int pid = fork(); switch(pid) { case -1: perror("fork"); return -1; case 0: // Child execl("/bin/cat", NULL); return 13; default: { // Parent int status; waitpid(pid, &status, 0); if(WIFEXITED(status)) { printf("Exit normally with code %i\n", WEXITSTATUS(status)); } if(WIFSIGNALED(status)) { printf("killed with signal %i\n", WTERMSIG(status)); } break; } } return 0; }
$ gcc test.c && ./a.out killed with signal 6
рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдмрдЪреНрдЪреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ,
init
рдмрдЪреНрдЪреЗ рдХрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдмрди рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╣ рд╕рдордп рдЖрдиреЗ рдкрд░
wait(2)
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдорд╛рддрд╛-рдкрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдЪреНрдЪреЗ рдХреА рдореГрддреНрдпреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдХрд░реНрдиреЗрд▓ рдмрдЪреНрдЪреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрд▓реНрдж рд╣реА рдПрдХ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реЗред
рдзрдиреНрдпрд╡рд╛рдж
рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╕рдВрдкрд╛рджрди рдФрд░ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╢рд╛ "рдЕрд▓" рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж;
рдХрдард┐рди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рд╕рд╛рд╢рд╛ "рд░реАрд╕" рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рдореЗрд░реЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдмреИрд░рд╛рдЬ рдкрд░ рд╣рдорд▓рд╛ рдХрд┐рдпрд╛ред