Привет, Хабр. Это история не про пет-проект. Это короткая история про поиск «своего» уровня сложности.

Наверное, у некоторых разработчиков бывал такой момент; когда смотришь на очередной код на python/jS и думаешь: «Это слишком просто. Где вызов? Где глубина?».
Вот и я, отучившись полгода на python, понял: это не моё. Не цепляет. Хотелось чего-то... фундаментального. Чего-то, что не сломается через год выхода новой версии фреймворка.

Я выбрал путь через тернии: С++ → Rust → и, наконец, чистый Cи и культовая книга Стивенса «Профессиональное программирование в UNIX».
И вот, спустя 3 месяца изучения системных вызовов, сигналов и межпроцессного взаимодействия и я написал проект (прошу оценить максимально объективно. И пусть с небольшим обоснованным негативом, это меня стимулирует стать лучше ;).

UNIX IPC Server — демон-сервер на чистом C, который умеет принимать запросы от клиентов через FIFO (отвечать сервер пока не умеет, но алгоритм тот же, поэтому пока не стал реализовывать поскольку посчитал это избыточным), хранить статистику в разделяемой памяти, синхронизировать доступ через семафоры, идентифицировать клиентов по PID/UID и корректно завершаться по сигналу.

Организация взаимодействий типа клиент-сервер с помощью каналов FIFO
Организация взаимодействий типа клиент-сервер с помощью каналов FIFO

Ссылка на GitHub

Почему я это сделал именно так?..

Можно было написать простой сервер на сокетах и успокоиться. Но мне хотелось собрать в одном проекте все основные механизмы UNIX, которые я учил по Стивенсу:

(1) FIFO — чтобы понять, как работают именованные каналы.

(2) Разделяемая память — чтобы прочувствовать, что такое настоящее shared state.

(3) Семафоры — чтобы набить шишки на синхронизации.

(4) Сигналы — чтобы сервер умел умирать красиво.

(5) Демонизация — чтобы понять, как живут процессы-долгожители.

(6) PID/UID идентификация — чтобы залезть в ядро (спасибо sysctl).

Получился этакий IPC Hello World на стероидах. Можно ли было проще? Да. Но я бы не узнал того, что узнал за эти месяцы (начал изучать unix/c - ровно 3 месяца назад).