Κοινή χρήση τεχνολογίας

Σειρά Android C: Linux Daemon

2024-07-12

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

1. Έννοια

Η διαδικασία Daemon (ξωτικό) είναι μια διαδικασία υπηρεσίας παρασκηνίου στο Linux Είναι μια διαδικασία με μεγάλη διάρκεια ζωής. Είναι συνήθως ανεξάρτητη από το τερματικό ελέγχου και εκτελεί περιοδικά ορισμένες εργασίες ή περιμένει να συμβούν ορισμένα συμβάντα.

2. Μοντέλο

2.1 Βήματα προγραμματισμού Daemon

  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, η διεπαφή μέσω της οποίας κάθε σύστημα επικοινωνεί με τους χρήστες ονομάζεται τερματικό, κάθε διαδικασία που ξεκινά να εκτελείται από αυτό το τερματικό θα βασίζεται σε
Προσαρτημένο σε αυτό το τερματικό, αυτό το τερματικό ονομάζεται τερματικό ελέγχου αυτών των διεργασιών Όταν το τερματικό ελέγχου είναι κλειστό, οι αντίστοιχες διεργασίες θα κλείσουν αυτόματα. Ωστόσο, πολλές από τις εφαρμογές μας δεν θέλουν να βγουν από τη διαδικασία χωρίς να απενεργοποιηθούν οι διακοπές, όπως βάσεις δεδομένων, υπηρεσίες web, υπηρεσίες παιχνιδιών κ.λπ. Αυτή τη στιγμή, πρέπει να χρησιμοποιήσουμε διαδικασίες δαίμονα.

4. Περίληψη

Αυτό το άρθρο εισάγει την έννοια της διαδικασίας δαίμονα, τα βήματα προγραμματισμού της διαδικασίας δαίμονα, την υλοποίηση κώδικα και τον ρόλο της διαδικασίας δαίμονα. Βοηθήστε μας να κατανοήσουμε τις αρχές λειτουργίας των προγραμμάτων παρασκηνίου κ.λπ.