Что такое зомби/демон?
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("/")меняет рабочую директорию на корневую, чтобы избежать блокировки файловой системы.- Закрытие стандартных файловых дескрипторов освобождает их для использования другими процессами.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться