Вернуться к статьям

Трубы, форки и зомби: как не превратить свой код в ходячий мертвец

14 мая 2026
2 мин чтения
Трубы, форки и зомби: как не превратить свой код в ходячий мертвец

Разбираемся с процессами в Linux — от создания до превращения в зомби, с юмором и без боли.

Если вы когда-нибудь пытались разобраться с системными вызовами в Linux и чувствовали себя как герой фильма ужасов, который зашел не в ту дверь — эта статья для вас. Мы поговорим о трубах (pipes), форках (forks) и зомби (zombies), но обещаем: крови не будет, только немного седых волос.

Что такое fork и почему это не вилка

fork() — это системный вызов, который создает копию текущего процесса. Представьте, что вы сидите за компьютером, и вдруг появляется ваша точная копия, которая тоже хочет работать. Только в отличие от фильмов-близнецов, здесь копия реально выполняет код. Родительский процесс получает PID ребенка, а ребенок — 0. Если вы забыли проверить возвращаемое значение, то можете случайно создать армию процессов, которые будут жрать память как зомби мозги.

Трубы: как соединить процессы, чтобы они не поссорились

Трубы (pipes) — это механизм межпроцессного взаимодействия. Вы создаете трубу, один процесс пишет в нее данные, другой читает. Звучит просто, но на практике это как пытаться передать записку через шумный коридор: нужно синхронизироваться, не забыть закрыть ненужные концы и не наступить на грабли deadlock'а. И да, если вы не закроете все дескрипторы, ваша программа будет висеть вечно, ожидая, пока кто-то откроет кран.

Зомби: процессы, которые не хотят умирать

Когда процесс завершается, он не исчезает сразу — он становится зомби. Это как призрак, который бродит по системе, пока родитель не вызовет wait(). Если родитель этого не делает, зомби накапливаются, и системная таблица процессов забивается. В итоге вы получаете сообщение "не могу создать новый процесс", а ваш сервер падает. Чтобы избежать этого, нужно либо вызывать wait() в цикле, либо использовать sigaction для игнорирования SIGCHLD. Помните: зомби — это не смешно, это баг.

Комментарий студии METABYTE: Мы тоже когда-то забывали закрывать файловые дескрипторы и потом гадали, почему сервер не отвечает. Если хотите, чтобы ваш код жил долго и счастливо, а не превращался в зомби-ферму, доверьте разработку профессионалам — у нас есть антидот от мертвых процессов.

Трубы, форки и зомби в Linux: руководство с юмором | METABYTE — METABYTE