← Назад ко всем вопросам

Что такое зомби/демон?

1️⃣ Как кратко ответить

Зомби-процесс — это процесс, который завершился, но его запись в таблице процессов еще не удалена, так как родительский процесс не вызвал wait(). Демон — это фоновый процесс, который работает независимо от управляющего терминала и обычно используется для выполнения системных задач.

2️⃣ Подробное объяснение темы

Зомби-процесс

Когда процесс в операционной системе Unix или Linux завершается, он переходит в состояние "зомби", если его родительский процесс не вызвал системный вызов wait() или waitpid(). Это состояние означает, что процесс завершил выполнение, но его запись в таблице процессов еще не удалена. Зомби-процессы занимают запись в таблице процессов, но не используют системные ресурсы, такие как память или процессорное время.

Зачем это нужно: Зомби-процессы позволяют родительскому процессу получить код завершения дочернего процесса. Это важно для обработки ошибок и управления процессами.

Пример кода:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
​
int main() {
    pid_t pid = fork(); // Создаем дочерний процесс
    if (pid > 0) {
        // Родительский процесс
        sleep(10); // Ждем 10 секунд, чтобы дочерний процесс стал зомби
    } else if (pid == 0) {
        // Дочерний процесс
        printf("Child process\n");
        _exit(0); // Завершаем дочерний процесс
    }
    return 0;
}
  • fork() создает новый процесс. Если fork() возвращает положительное значение, это родительский процесс, если 0 — дочерний.
  • sleep(10) в родительском процессе позволяет дочернему процессу завершиться и стать зомби.
  • _exit(0) завершает дочерний процесс.

Демон

Демон — это фоновый процесс, который работает независимо от управляющего терминала. Демоны обычно запускаются при загрузке системы и выполняют системные задачи, такие как управление сетевыми соединениями, обслуживание оборудования или выполнение периодических задач.

Зачем это нужно: Демоны обеспечивают выполнение фоновых задач, которые должны быть доступны в любое время, независимо от того, вошел ли пользователь в систему.

Пример кода:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
​
void create_daemon() {
    pid_t pid = fork(); // Создаем дочерний процесс
    if (pid < 0) {
        exit(EXIT_FAILURE); // Ошибка при создании процесса
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS); // Завершаем родительский процесс
    }
​
    if (setsid() < 0) {
        exit(EXIT_FAILURE); // Создаем новый сеанс
    }
​
    pid = fork(); // Создаем второй дочерний процесс
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS); // Завершаем первый дочерний процесс
    }
​
    umask(0); // Устанавливаем права доступа к файлам
​
    chdir("/"); // Меняем рабочую директорию на корневую
​
    close(STDIN_FILENO); // Закрываем стандартные файловые дескрипторы
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
}
​
int main() {
    create_daemon(); // Создаем демон
    while (1) {
        // Основной код демона
        sleep(30); // Демон выполняет задачу каждые 30 секунд
    }
    return 0;
}
  • fork() создает дочерний процесс. Первый fork() позволяет завершить родительский процесс.
  • setsid() создает новый сеанс, чтобы демон не зависел от управляющего терминала.
  • Второй fork() гарантирует, что демон не станет лидером сеанса.
  • umask(0) сбрасывает маску создания файлов, чтобы демон мог создавать файлы с любыми правами доступа.
  • chdir("/") меняет рабочую директорию на корневую, чтобы избежать блокировки файловой системы.
  • Закрытие стандартных файловых дескрипторов освобождает их для использования другими процессами.

Тема: Tools / DevOps / Linux
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки