Обмен технологиями

Android серии C: демон Linux

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Концепция

Процесс Daemon (elf) — это фоновый сервисный процесс в Linux. Это процесс с длительным сроком действия. Обычно он не зависит от терминала управления и периодически выполняет определенные задачи или ожидает возникновения определенных событий.

2. Модель

2.1 Этапы программирования демона

  1. Создаем дочерний процесс, родительский процесс завершается, и вся работа выполняется в дочернем процессе: формально отделенном от управляющего терминала;
  2. Создайте новую функцию setsid() сеанса в дочернем процессе, сделав дочерний процесс полностью независимым и вышедшим из-под контроля;
  3. Измените текущий каталог на корневой каталог chdir()Функция: Чтобы предотвратить занятие немонтируемой файловой системы, вы также можете изменить ее на другие пути;
  4. Сброс маски разрешений файла: функция umask() не позволяет унаследованным маскам создания файлов отказывать в определенных разрешениях, чтобы повысить гибкость процесса демона;
  5. Закройте файловый дескриптор: унаследованный открытый файл не будет использоваться, что приводит к трате системных ресурсов и не может быть удалено;
  6. Начните выполнять основную работу процесса-демона;
  7. Обработка выхода демона.

2.2 Модель кода

#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h>
void daemonize(void)
{
	pid_t pid;
	/*
	 * 成为一个新会话的首进程,失去控制终端 
	 */
	 if ((pid = fork()) < 0) { 
	 	perror("fork");
		exit(1);
		} else if (pid != 0) /* parent */
			exit(0); 
		setsid();
	/*
	 * 改变当前工作目录到/目录下. 
	 */
	if (chdir("/") < 0) { 
		perror("chdir"); 
		exit(1);
	}
	/* 设置umask为0 */ 
	umask(0);
	//重定向0,1,2文件描述符到 /dev/null,因为已经失去控制终端,再操作0,1,2没有意义.
	close(0); 
	open("/dev/null", O_RDWR); 
	dup2(0, 1);
	dup2(0, 2);
}
int main(void) {
	daemonize(); 
	while(1);
	/* 在此循环中可以实现守护进程的核心工作 */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

Когда вы запускаете эту программу, она становится процессом-демоном и больше не связана с текущим терминалом. Вы не можете увидеть его с помощью команды ps. Чтобы увидеть его, необходимо запустить команду ps с параметром x. Кроме того, вы можете видеть, что закрытие окна терминала или выход из системы не повлияют на работу демона.

3. Роль процесса-демона

Почему процесс демона необходимо отделить от управляющего терминала?

Причина, по которой он отделен от терминала, заключается в том, чтобы предотвратить прерывание процесса информацией, генерируемой любым терминалом, и его информация во время выполнения не будет отображаться ни на одном терминале.Поскольку в Linux интерфейс, через который каждая система общается с пользователями, называется терминалом, каждый процесс, запускающийся с этого терминала, будет полагаться на
Подключенный к этому терминалу, этот терминал называется терминалом управления этими процессами. Когда терминал управления закрывается, соответствующие процессы автоматически закрываются. Однако многие наши приложения не хотят выходить из процесса без отключения прерываний, например базы данных, веб-сервисы, игровые сервисы и т. д. На данный момент нам нужно использовать процесс-демон.

4. Резюме

В этой статье представлена ​​концепция процесса-демона, этапы программирования процесса-демона, реализация кода и роль процесса-демона. Помогите нам понять принципы работы фоновых программ и т. д.