fork

FORK(2)         Ð ÑководÑÑво пÑогÑаммиÑÑа Linux         FORK(2)



ÐÐЯ
       fork - ÑоздаÑÑ Ð´Ð¾ÑеÑний пÑоÑеÑÑ

ÐÐÐÐÐ
       #include <unistd.h>

       pid_t fork(void);

ÐÐÐСÐÐÐÐ
       ÐÑзов fork() ÑоздаÑÑ Ð½Ð¾Ð²Ñй пÑоÑеÑÑ Ð¿Ð¾ÑÑедÑÑвом
       копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑзÑваÑÑего пÑоÑеÑÑа. ÐовÑй
       пÑоÑеÑÑ ÑÑиÑаеÑÑÑ Ð´Ð¾ÑеÑним пÑоÑеÑÑом. ÐÑзÑваÑÑий
       пÑоÑеÑÑ ÑÑиÑаеÑÑÑ ÑодиÑелÑÑким пÑоÑеÑÑом.

       ÐоÑеÑний и ÑодиÑелÑÑкий пÑоÑеÑÑÑ Ð½Ð°ÑодÑÑÑÑ Ð²
       оÑделÑнÑÑ Ð¿ÑоÑÑÑанÑÑÐ²Ð°Ñ Ð¿Ð°Ð¼ÑÑи. СÑÐ°Ð·Ñ Ð¿Ð¾Ñле
       fork() ÑÑи пÑоÑÑÑанÑÑва имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ
       ÑодеÑжимое. ÐапиÑÑ Ð² памÑÑÑ, оÑобÑажение
       Ñайлов (mmap(2)) и ÑнÑÑие оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (munmap(2)),
       вÑполненнÑÑ Ð² одном пÑоÑеÑÑе, ниÑего не
       изменÑÐµÑ Ð² дÑÑгом.

       ÐоÑеÑний пÑоÑеÑÑ ÑвлÑеÑÑÑ ÑоÑной копией
       ÑодиÑелÑÑкого пÑоÑеÑÑа за иÑклÑÑением
       ÑледÑÑÑÐ¸Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñов:

       *  ÐоÑомок Ð¸Ð¼ÐµÐµÑ Ñвой ÑникалÑнÑй
          иденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑеÑÑа, и ÑÑÐ¾Ñ PID
          (иденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑеÑÑа) не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð½Ð¸ Ñ
          одним ÑÑÑеÑÑвÑÑÑим иденÑиÑикаÑоÑом гÑÑппÑ
          пÑоÑеÑÑов (setpgid(2)) или ÑеанÑов.

       *  ÐденÑиÑикаÑÐ¾Ñ ÑодиÑелÑÑкого пÑоÑеÑÑа Ñ
          поÑомка Ñавен иденÑиÑикаÑоÑÑ
          ÑодиÑелÑÑкого пÑоÑеÑÑа.

       *  ÐоÑомок не наÑледÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки памÑÑи
          ÑодиÑÐµÐ»Ñ (mlock(2), mlockall(2)).

       *  СÑÑÑÑики иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑÑÑÑов (getrusage(2)) и
          вÑемени Ð¦Ð Ñ Ð¿Ð¾Ñомка ÑбÑоÑÐµÐ½Ñ Ð² 0.

       *  ÐÐ°Ð±Ð¾Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑÐ¸Ñ Ñигналов поÑомка
          изнаÑалÑно пÑÑÑ (sigpending(2)).

       *  ÐоÑомок не наÑледÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑемаÑоÑов
          ÑодиÑÐµÐ»Ñ (semop(2)).

       *  ÐоÑомок не наÑледÑÐµÑ ÑвÑзаннÑе Ñ Ð¿ÑоÑеÑÑом
          блокиÑовки ÑодиÑÐµÐ»Ñ (fcntl(2)) (Ñ Ð´ÑÑгой
          ÑÑоÑонÑ, он наÑледÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки ÑайловÑÑ
          опиÑаний fcntl(2) и блокиÑовки flock(2)).

       *  ÐоÑомок не наÑледÑÐµÑ ÑаймеÑÑ ÑодиÑелÑ
          (setitimer(2), alarm(2), timer_create(2)).

       *  ÐоÑомок не наÑледÑÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑие
          вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии аÑинÑÑонного
          ввода-вÑвода (aio_read(3), aio_write(3)) и конÑекÑÑÑ
          аÑинÑÑонного ввода-вÑвода ÑодиÑÐµÐ»Ñ (Ñм.
          io_setup(2)).

       ÐÑе пеÑеÑиÑленнÑе аÑÑибÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² POSIX.1.
       РодиÑÐµÐ»Ñ Ð¸ поÑомок Ñакже оÑлиÑаÑÑÑÑ Ð¿Ð¾
       ÑледÑÑÑим аÑÑибÑÑам пÑоÑеÑÑа, коÑоÑÑе еÑÑÑ
       ÑолÑко в Linux:

       *  ÐоÑомок не наÑледÑÐµÑ ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±
          изменении каÑалога (dnotify) ÑодиÑелÑ
          (ÑмоÑÑиÑе опиÑание F_NOTIFY в fcntl(2)).

       *  ÐаÑÑÑойка PR_SET_PDEATHSIG Ñ prctl(2) ÑбÑаÑÑваеÑÑÑ, и
          поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ñомок не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ñигнал о
          завеÑÑении ÑабоÑÑ ÑодиÑелÑ.

       *  РезеÑвное знаÑение по ÑмолÑаниÑ
          ÑÑÑанавливаеÑÑÑ ÑавнÑм ÑодиÑелÑÑкомÑ
          ÑекÑÑÐµÐ¼Ñ ÑезеÑÐ²Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑаймеÑа.
          СмоÑÑиÑе опиÑание PR_SET_TIMERSLACK в prctl(2).

       *  ÐÑобÑажение памÑÑи, помеÑенное Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
          Ñлага MADV_DONTFORK ÑеÑез madvise(2), пÑи fork() не
          наÑледÑеÑÑÑ.

       *  Сигнал завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ Ð¿Ð¾Ñомка вÑегда
          SIGCHLD (Ñм. clone(2)).

       *  ÐиÑÑ Ð¿Ñав доÑÑÑпа к поÑÑÑ, ÑÑÑановленнÑе Ñ
          помоÑÑÑ ioperm(2), не наÑледÑÑÑÑÑ Ð¿Ð¾Ñомком;
          поÑомок должен ÑÑÑановиÑÑ Ð²Ñе нÑжнÑе емÑ
          биÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ioperm(2).

       Также ÑÑÐ¾Ð¸Ñ ÑÑиÑÑваÑÑ ÑледÑÑÑее:

       *  ÐÑоÑеÑÑ Ð¿Ð¾Ñомка ÑоздаÑÑÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñной ниÑÑÑ â
          Ñой, коÑоÑÐ°Ñ Ð²Ñзвала fork(). ÐÑÑ Ð²Ð¸ÑÑÑалÑное
          адÑеÑное пÑоÑÑÑанÑÑво ÑодиÑÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸ÑÑеÑÑÑ Ð²
          поÑомок, вклÑÑÐ°Ñ ÑоÑÑоÑние мÑÑÑекÑов,
          ÑÑловнÑÑ Ð¿ÐµÑеменнÑÑ Ð¸ дÑÑÐ³Ð¸Ñ Ð¾Ð±ÑекÑов pthreads;
          в ÑлÑÑае пÑоблем Ñ ÑÑим Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ
          pthread_atfork(3).

       *  РмногониÑивой пÑогÑамме поÑле fork()
          поÑомок Ð¼Ð¾Ð¶ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно вÑзÑваÑÑ ÑолÑко
          безопаÑнÑе-аÑинÑÑоннÑе-ÑигналÑнÑе ÑÑнкÑии
          (ÑмоÑÑиÑе signal(7)) до ÑÐµÑ Ð¿Ð¾Ñ, пока не вÑзовеÑ
          execve(2).

       *  ÐоÑомок наÑледÑÐµÑ ÐºÐ¾Ð¿Ð¸Ð¸ набоÑа оÑкÑÑÑÑÑ
          ÑайловÑÑ Ð´ÐµÑкÑипÑоÑов ÑодиÑелÑ. ÐаждÑй
          ÑайловÑй деÑкÑипÑÐ¾Ñ Ð² поÑомке ÑÑÑлаеÑÑÑ Ð½Ð°
          Ñо же опиÑание Ñайла ÑÑо и ÑодиÑелÑ
          (ÑмоÑÑиÑе open(2)). ÐÑо ознаÑаеÑ, ÑÑо два
          ÑайловÑÑ Ð´ÐµÑкÑипÑоÑа ÑовмеÑÑно иÑполÑзÑÑÑ
          Ñлаги ÑоÑÑоÑÐ½Ð¸Ñ Ð¾ÑкÑÑÑого Ñайла, ÑмеÑение
          Ñайла и аÑÑибÑÑÑ Ð²Ð²Ð¾Ð´Ð°-вÑвода, ÑпÑавлÑемÑе
          Ñигналами (ÑмоÑÑиÑе опиÑание F_SETOWN и F_SETSIG
          в fcntl(2)).

       *  ÐоÑомок наÑледÑÐµÑ ÐºÐ¾Ð¿Ð¸Ð¸ набоÑа ÑайловÑÑ
          деÑкÑипÑоÑов оÑкÑÑÑÑÑ Ð¾ÑеÑедей ÑообÑений
          ÑодиÑÐµÐ»Ñ (ÑмоÑÑиÑе mq_overview(7)). ÐаждÑй
          ÑайловÑй деÑкÑипÑÐ¾Ñ Ð² поÑомке ÑÑÑлаеÑÑÑ Ð½Ð°
          Ñо же опиÑание оÑкÑÑÑой оÑеÑеди ÑообÑений
          ÑÑо и ÑодиÑелÑ. ÐÑо ознаÑаеÑ, ÑÑо два
          ÑайловÑÑ Ð´ÐµÑкÑипÑоÑа ÑовмеÑÑно иÑполÑзÑÑÑ
          Ñлаги (mq_flags).

       *  ÐоÑомок наÑледÑÐµÑ ÐºÐ¾Ð¿Ð¸Ð¸ набоÑа поÑоков
          оÑкÑÑÑÑÑ ÐºÐ°Ñалогов ÑодиÑÐµÐ»Ñ (ÑмоÑÑиÑе
          opendir(3)). Ð POSIX.1 Ñказано, ÑÑо ÑооÑвеÑÑÑвÑÑÑие
          поÑоки каÑалогов в ÑодиÑеле и поÑомке
          могÑÑ ÑовмеÑÑно иÑполÑзоваÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð²
          поÑоке каÑалога; в Linux/glibc они не могÑÑ
          ÑÑого делаÑÑ.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном завеÑÑении ÑодиÑÐµÐ»Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ
       PID пÑоÑеÑÑа-поÑомка, а пÑоÑеÑÑÑ-поÑомкÑ
       возвÑаÑаеÑÑÑ 0. ÐÑи оÑибке ÑодиÑелÑÑкомÑ
       пÑоÑеÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ -1, пÑоÑеÑÑ-поÑомок не
       ÑоздаÑÑÑÑ, а знаÑение errno ÑÑÑанавливаеÑÑÑ Ð²
       ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       EAGAIN Ðозникло ÑиÑÑемного огÑаниÑение на
              колиÑеÑÑво ниÑей. ÐÑÑÑ Ð½ÐµÑколÑко
              огÑаниÑений, коÑоÑÑе могÑÑ Ð²ÑзваÑÑ ÑÑÑ
              оÑибкÑ: бÑл доÑÑигнÑÑ Ð¼Ñгкий
              огÑаниÑиÑÐµÐ»Ñ RLIMIT_NPROC (задаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
              setrlimit(2)), коÑоÑÑй огÑаниÑиваеÑ
              колиÑеÑÑво пÑоÑеÑÑов и ниÑе длÑ
              ÑеалÑного ID полÑзоваÑелÑ; бÑл доÑÑигнÑÑ
              ÑдеÑнÑй ÑиÑÑемнÑй огÑаниÑиÑÐµÐ»Ñ Ð½Ð°
              колиÑеÑÑво пÑоÑеÑÑов и ниÑей,
              /proc/sys/kernel/threads-max (ÑмоÑÑиÑе proc(5)); бÑл
              доÑÑигнÑÑо макÑималÑное колиÑеÑÑво PID,
              /proc/sys/kernel/pid_max (ÑмоÑÑиÑе proc(5)).

       EAGAIN ÐÑзÑваÑÑий ÑабоÑÐ°ÐµÑ Ð¿Ð¾ алгоÑиÑмÑ
              планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ SCHED_DEADLINE и Ñ Ð½ÐµÐ³Ð¾ не
              ÑÑÑановлен Ñлаг ÑбÑоÑа-пÑи-fork (reset-on-fork).
              СмоÑÑиÑе sched(7).

       ENOMEM ÐÑзов fork() завеÑÑилÑÑ Ñ Ð¾Ñибкой из-за
              невозможноÑÑи ÑазмеÑÑиÑÑ Ð½ÐµÐ¾Ð±ÑодимÑе
              ÑÑÑÑкÑÑÑÑ ÑдÑа, поÑÐ¾Ð¼Ñ ÑÑо ÑлиÑком мало
              памÑÑи.

       ENOMEM ÐÑла попÑÑка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð¾ÑеÑний пÑоÑеÑÑ Ð²
              пÑоÑÑÑанÑÑве имÑн PID, Ñей пÑоÑеÑÑ Â«init»
              завеÑÑил ÑабоÑÑ. СмоÑÑиÑе pid_namespaces(7).

       ENOSYS ÐÑзов fork() не поддеÑживаеÑÑÑ Ð½Ð° ÑÑой
              плаÑÑоÑме (напÑимеÑ, из-за Ñого, ÑÑо
              аппаÑаÑное обеÑпеÑение не ÑодеÑжиÑ
              блока ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ (MMU)).

       ERESTARTNOINTR (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.17)
              СиÑÑемнÑй вÑзов бÑл пÑеÑван Ñигналом и
              пеÑезапÑÑен (Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¼ÐµÑено ÑолÑко
              пÑи ÑÑаÑÑиÑовке).

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

ÐÐÐÐЧÐÐÐЯ
       Ð Linux, fork() Ñеализован Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       «копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¿Ñи запиÑи» (copy-on-write,
       COW), поÑÑÐ¾Ð¼Ñ ÑаÑÑÐ¾Ð´Ñ Ð½Ð° вÑзов ÑоÑÑоÑÑ Ð¸Ð·
       вÑемени и памÑÑи, ÑÑебÑемой на копиÑование
       ÑÑÑаниÑнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ ÑодиÑÐµÐ»Ñ Ð¸ ÑозданиÑ
       ÑникалÑной ÑÑÑÑкÑÑÑÑ, опиÑÑваÑÑей задаÑÑ.

   ÐÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой C и ÑдÑом
       ÐаÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии 2.3.3, вмеÑÑо Ñого, ÑÑобÑ
       вÑзÑваÑÑ ÑиÑÑемнÑй вÑзов fork(), обÑÑÑоÑнаÑ
       ÑÑнкÑÐ¸Ñ fork() в glibc, как ÑаÑÑÑ ÑеализаÑии ниÑей
       NPTL, вÑзÑÐ²Ð°ÐµÑ clone(2) Ñ Ñлагами, коÑоÑÑе
       обеÑпеÑиваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑадиÑионного
       ÑиÑÑемного вÑзова (вÑзов fork() ÑквиваленÑен
       вÑÐ·Ð¾Ð²Ñ clone(2), еÑли знаÑение Ñавно flags SIGCHLD).
       ÐбÑÑÑка в glibc вÑзÑÐ²Ð°ÐµÑ Ð²Ñе обÑабоÑÑики пÑи
       веÑвлении (fork), коÑоÑÑе бÑли
       заÑегиÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ pthread_atfork(3).

ÐÐ ÐÐÐÐ
       СмоÑÑиÑе pipe(2) и wait(2).

СÐÐТРÐТРТÐÐÐÐ
       clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2),
       wait(2), daemon(3), capabilities(7), credentials(7)



Linux                             2016-07-17                           FORK(2)