Какие системные вызовы в Linux ты знаешь?

«Какие системные вызовы в Linux ты знаешь?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Linux системные вызовы — это интерфейс между пользовательским пространством и ядром. Вот ключевые из них, с которыми я часто работаю в контексте DevOps:

  • Управление процессами:
    • fork() / clone() — создание нового процесса или потока.
    • exec() — замена образа выполняемого процесса.
    • wait() / waitpid() — ожидание изменения состояния дочернего процесса.
    • kill() — отправка сигнала процессу.
  • Файловая система и ввод-вывод:
    • open(), read(), write(), close() — базовые операции с файлами.
    • stat() / lstat() — получение информации о файле.
    • mmap() — отображение файла или устройства в память для высокопроизводительного доступа.
  • Сетевое взаимодействие:
    • socket() — создание конечной точки для сетевого обмена.
    • bind(), listen(), accept() — настройка TCP-сервера.
    • connect() — установка соединения с TCP-сервером.
    • select(), poll(), epoll() — мультиплексирование ввода-вывода для обработки множества соединений.
  • Управление памятью:
    • brk() / sbrk() — изменение размера сегмента данных процесса.
    • mprotect() — изменение защиты области памяти.

Практический пример: При мониторинге или отладке высоконагруженного приложения (например, веб-сервера Nginx) с помощью strace я анализирую вызовы epoll_wait() (для асинхронного ввода-вывода), accept() и write(), чтобы выявить узкие места.

# Пример: отслеживание системных вызовов процесса
strace -p <PID> -e trace=network,file