Οι δαίμονες είναι διεργασίες που δεν εκτελούνται απευθείας υπό τον έλεγχο του χρήστη αλλά εξυπηρετούνται στο παρασκήνιο. Συνήθως, ξεκινούν κατά την εκκίνηση του συστήματος και λειτουργούν συνεχώς μέχρι να τερματιστεί η λειτουργία του συστήματος. Η μόνη διαφορά μεταξύ αυτών των κανονικών διεργασιών είναι ότι δεν στέλνουν μηνύματα στην κονσόλα ή στην οθόνη με κανέναν τρόπο.

Δείτε πώς μπορείτε να δημιουργήσετε έναν δαίμονα σε μια μηχανή Linux.

Μια σύντομη εισαγωγή στο πώς δημιουργούνται οι δαίμονες

Πολλοί δαίμονες τρέχουν στο σύστημα και μερικά γνωστά παραδείγματα δαίμονων είναι τα εξής:

  • crond: Κάνει τις εντολές να εκτελούνται την καθορισμένη ώρα
  • sshd: Επιτρέπει τη σύνδεση στο σύστημα από απομακρυσμένα μηχανήματα
  • httpd: Εξυπηρετεί ιστοσελίδες
  • nfsd: Επιτρέπει την κοινή χρήση αρχείων μέσω του δικτύου

Επίσης, οι διαδικασίες δαίμονα συνήθως ονομάζονται για να τελειώνουν με το γράμμα ρε, αν και δεν είναι υποχρεωτικό.

Για να εκτελεστεί μια διεργασία ως δαίμονας, ακολουθείται η ακόλουθη διαδρομή:

  • Οι αρχικές λειτουργίες, όπως η ανάγνωση αρχείων διαμόρφωσης ή η απόκτηση των απαραίτητων πόρων συστήματος, πρέπει να εκτελεστούν πριν η διαδικασία γίνει δαίμονας. Με αυτόν τον τρόπο, το σύστημα μπορεί να αναφέρει τα ληφθέντα σφάλματα στον χρήστη και η διαδικασία θα τερματιστεί με έναν κατάλληλο κωδικό σφάλματος.
    instagram viewer
  • Δημιουργείται μια διεργασία που εκτελείται στο παρασκήνιο με το init ως γονική διαδικασία. Για το σκοπό αυτό, μια υποδιεργασία διαχωρίζεται πρώτα από τη διεργασία έναρξης και στη συνέχεια η ανώτερη διεργασία τερματίζεται με έξοδο.
  • Θα πρέπει να ανοίξει μια νέα περίοδος λειτουργίας καλώντας τη συνάρτηση setsid και η διαδικασία θα πρέπει να αποσυνδεθεί από το τερματικό.
  • Όλες οι περιγραφές ανοιχτών αρχείων που κληρονομήθηκαν από τη γονική διαδικασία είναι κλειστές.
  • Τυπική είσοδος, έξοδοςκαι τα μηνύματα σφάλματος ανακατευθύνονται σε /dev/null.
  • Ο κατάλογος εργασίας της διαδικασίας πρέπει να αλλάξει.

Τι είναι τα Daemon Sessions;

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

Κάθε συνεδρία αποτελείται από ομάδες διαδικασιών. Μπορείτε να περιγράψετε αυτήν την κατάσταση ως εξής:

Το τερματικό όπου οι διεργασίες λαμβάνουν τις εισόδους τους και στέλνουν τις εξόδους τους ονομάζεται τερματικό ελέγχου. Ένα τερματικό ελέγχου συσχετίζεται μόνο με μία συνεδρία τη φορά.

Μια συνεδρία και οι ομάδες διεργασιών σε αυτήν έχουν αριθμούς αναγνώρισης (ID). Αυτοί οι αριθμοί αναγνώρισης είναι οι αριθμοί αναγνώρισης διεργασίας (PID) των ηγετών των ομάδων συνεδρίας και διεργασιών. Μια θυγατρική διαδικασία μοιράζεται την ίδια ομάδα με τη γονική της διαδικασία. Όταν είναι πολλαπλές διεργασίες επικοινωνεί με τον μηχανισμό του σωλήνα, η πρώτη διαδικασία γίνεται ο αρχηγός της ομάδας διαδικασίας.

Δημιουργία μιας διαδικασίας Daemon στο Linux

Εδώ θα δείτε πώς μπορείτε να δημιουργήσετε μια συνάρτηση δαίμονα. Για το σκοπό αυτό, θα δημιουργήσετε μια συνάρτηση με το όνομα _δαίμονας. Μπορείτε να ξεκινήσετε ονομάζοντας τον κωδικό της εφαρμογής που θα εκτελείται ως δαίμονας ως δοκιμή.γ, και ο κώδικας με τον οποίο θα δημιουργήσετε τον δαίμονα λειτουργεί ως δαίμονας.γ.

//test.c
#περιλαμβάνω <stdio.h>
ενθ_δαίμονας(ενθ, ενθ);
ενθκύριος()
{
getchar();
_daemon (0, 0);
getchar();
ΕΠΙΣΤΡΟΦΗ0;
}
//daemon.c
#περιλαμβάνω <sys/types.h>
#περιλαμβάνω <sys/stat.h>
#περιλαμβάνω <stdlib.h>
#περιλαμβάνω <stdio.h>
#περιλαμβάνω <fcntl.h>
#περιλαμβάνω <unistd.χ>
#περιλαμβάνω <linux/fs.h>
#περιλαμβάνω <linux/limits.h>
ενθ_δαίμονας(ενθ nochdir, ενθ noclose){
pid_t pid;
pid = fork(); // Διακοπή της γονικής διαδικασίας
αν (πιδ < 0) {
έξοδος(EXIT_FAILURE);
}
αν (πιδ > 0) {
έξοδος(EXIT_SUCCESS);
}
ΕΠΙΣΤΡΟΦΗ0;
}

Για να δημιουργήσετε έναν δαίμονα, χρειάζεστε μια διαδικασία παρασκηνίου της οποίας η γονική διαδικασία είναι init. Στον παραπάνω κώδικα, _δαίμονας δημιουργεί μια θυγατρική διαδικασία και στη συνέχεια σκοτώνει τη γονική διαδικασία. Σε αυτήν την περίπτωση, η νέα σας διεργασία θα είναι υποδιεργασία του init και θα συνεχίσει να εκτελείται στο παρασκήνιο.

Τώρα μεταγλωττίστε την εφαρμογή με την ακόλουθη εντολή και εξετάστε την κατάσταση της διαδικασίας πριν και μετά _δαίμονας λέγεται:

gcc-οδοκιμήδοκιμή.ντοδαίμονας.ντο

Εκτελέστε την εφαρμογή και μεταβείτε σε διαφορετικό τερματικό χωρίς να πατήσετε άλλα πλήκτρα:

./δοκιμή

Μπορείτε να δείτε ότι οι τιμές που σχετίζονται με τη διαδικασία σας είναι οι εξής. Εδώ, θα πρέπει να χρησιμοποιήσετε την εντολή ps για να λάβετε πληροφορίες σχετικά με τη διαδικασία. Σε αυτή την περίπτωση, το _δαίμονας η λειτουργία δεν έχει κληθεί ακόμα.

ps -C δοκιμή -ο "pid ppid pgid sid tty statεντολή"
# Έξοδος
PID PPID PGID SID TT STAT ΕΝΤΟΛΗ
10296 5119 10296 5117 πόντοι/2 S+ ./δοκιμή

Όταν κοιτάς το STAT στο πεδίο, βλέπετε ότι η διεργασία σας εκτελείται αλλά περιμένει να συμβεί ένα συμβάν εκτός προγράμματος που θα την κάνει να εκτελείται στο προσκήνιο.

Συντομογραφία Εννοια
μικρό Αναμονή στον ύπνο για να συμβεί ένα γεγονός
Τ Η εφαρμογή σταμάτησε
μικρό Υπεύθυνος συνεδρίας
+ Η εφαρμογή εκτελείται στο προσκήνιο

Μπορείτε να δείτε ότι η γονική διαδικασία της αίτησής σας είναι το κέλυφος όπως αναμένεται.

ps -jp 5119 
# Έξοδος
PID PGID SID TTY TIME CMD
5119 5119 5117 pts/2 00:00:02 zsh

Τώρα επιστρέψτε στο τερματικό όπου εκτελείτε την εφαρμογή σας και πατήστε Εισαγω να επικαλεστεί το _δαίμονας λειτουργία. Στη συνέχεια, κοιτάξτε ξανά τις πληροφορίες διαδικασίας στο άλλο τερματικό.

ps -C δοκιμή -ο "pid ppid pgid sid tty statεντολή"
# Έξοδος
PID PPID PGID SID TT STAT ΕΝΤΟΛΗ
22504 1 22481 5117 pts/2 S ./δοκιμή

Πρώτα απ 'όλα, μπορείτε να πείτε ότι η νέα υποδιεργασία εκτελείται στο παρασκήνιο αφού δεν βλέπετε το + χαρακτήρας στο STAT πεδίο. Τώρα εξετάστε ποια είναι η γονική διαδικασία της διαδικασίας χρησιμοποιώντας την ακόλουθη εντολή:

ps -jp 1 
​​​​​​​# Έξοδος
PID PGID SID TTY TIME CMD
1 1 1? 00:00:01systemd

Μπορείτε τώρα να δείτε ότι η γονική διαδικασία της διαδικασίας σας είναι η systemd επεξεργάζομαι, διαδικασία. Αναφέρεται παραπάνω ότι για το επόμενο βήμα, θα πρέπει να ανοίξει μια νέα συνεδρία και να αποσυνδεθεί η διαδικασία από το τερματικό ελέγχου. Για αυτό, χρησιμοποιείτε τη συνάρτηση setsid. Προσθέστε αυτήν την κλήση στην κλήση σας _δαίμονας λειτουργία.

Το κομμάτι κώδικα που πρέπει να προσθέσετε είναι το εξής:

αν (setsid() == -1) 
ΕΠΙΣΤΡΟΦΗ-1;

Τώρα που επιθεωρήσατε το κράτος στο παρελθόν _δαίμονας κάλεσε, μπορείτε τώρα να αφαιρέσετε το πρώτο getchar λειτουργία στο δοκιμή.γ κώδικας.

//test.c
#περιλαμβάνω <stdio.h>
ενθ_δαίμονας(ενθ, ενθ);
ενθκύριος()
{
_daemon (0, 0);
getchar();
ΕΠΙΣΤΡΟΦΗ0;
}

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

ps -C δοκιμή -ο "pid ppid pgid sid tty statεντολή"
​​​​​​​# Έξοδος
PID PPID PGID SID TT STAT ΕΝΤΟΛΗ
25494 1 25494 25494? Ss ./δοκιμή

ο ? υπογράψτε στο TT Το πεδίο υποδεικνύει ότι η διεργασία σας δεν είναι πλέον συνδεδεμένη σε τερματικό. Παρατηρήστε ότι το PID, ΠΓΙΔ, και SID οι αξίες της διαδικασίας σας είναι οι ίδιες. Η διαδικασία σας είναι πλέον ηγέτης συνεδρίας.

Στο επόμενο βήμα, αλλάξτε τον κατάλογο εργασίας στον ριζικό κατάλογο σύμφωνα με την τιμή του ορίσματος που περάσατε. Μπορείτε να προσθέσετε το ακόλουθο απόσπασμα στο _δαίμονας λειτουργία για αυτό:

αν (!nochdir) {
αν (chdir("/") == -1)
ΕΠΙΣΤΡΟΦΗ-1;
}

Τώρα, σύμφωνα με το επιχείρημα που εγκρίθηκε, όλοι οι περιγραφείς αρχείων μπορούν να κλείσουν. Προσθέστε τον ακόλουθο κώδικα στο _δαίμονας λειτουργία:

#define NR_OPEN 1024
αν (!noclose) {
για (i = 0; Εγώ < NR_OPEN; i++)
κλείσιμο (i);
Άνοιξε("/dev/μηδενικό", O_RDWR);
dup (0);
dup (0);
}

Αφού κλείσουν όλοι οι περιγραφείς αρχείων, τα νέα αρχεία που ανοίγονται από τον δαίμονα θα εμφανίζονται με τους περιγραφείς 0, 1 και 2 αντίστοιχα. Σε αυτή την περίπτωση, για παράδειγμα, το printf Οι εντολές στον κώδικα θα κατευθυνθούν στο δεύτερο ανοιχτό αρχείο. Για να αποφευχθεί αυτό, τα τρία πρώτα αναγνωριστικά δείχνουν στο /dev/null συσκευή.

Σε αυτή την περίπτωση, η τελική κατάσταση του _δαίμονας η λειτουργία θα είναι η εξής:

#περιλαμβάνω <sys/types.h>
#περιλαμβάνω <sys/stat.h>
#περιλαμβάνω <stdio.h>
#περιλαμβάνω <stdlib.h>
#περιλαμβάνω <fcntl.h>
#περιλαμβάνω <λάθος.η>
#περιλαμβάνω <unistd.χ>
#περιλαμβάνω <syslog.h>
#περιλαμβάνω <χορδή.χ>
ενθ_δαίμονας(κενός){
// PID: Αναγνωριστικό διαδικασίας
// SID: Αναγνωριστικό περιόδου λειτουργίας
pid_t pid, sid;
pid = fork(); // Διακοπή της γονικής διαδικασίας
αν (πιδ < 0) {
έξοδος(EXIT_FAILURE);
}
αν (πιδ > 0) {
έξοδος(EXIT_SUCCESS);
}
// Δημιουργώ ένα SIDΓιαπαιδί
sid = setsid();
αν (σιδ < 0) {
// ΑΠΟΤΥΧΙΑ
έξοδος(EXIT_FAILURE);
}
αν ((chdir("/")) < 0) {
// ΑΠΟΤΥΧΙΑ
έξοδος(EXIT_FAILURE);
}
κλείσιμο (STDIN_FILENO);
κλείσιμο (STDOUT_FILENO);
κλείσιμο (STDERR_FILENO);
ενώ (1) {
// Μερικές εργασίες
ύπνος (30);
}
έξοδος(EXIT_SUCCESS);
}

Ακολουθεί ένα παράδειγμα αποσπάσματος κώδικα που εκτελεί το sshd εφαρμογή ως α δαίμονας:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
ενθ fd;
if (δαίμονας (0, 0) < 0)
μοιραίος("Ο daemon() απέτυχε: %.200s", strerror (errno));
/* Αποσύνδεση από τον έλεγχο tty. */
fd = ανοιχτό (_PATH_TTY, O_RDWR | O_NOCTTY);
αν (fd >= 0) {
(κενός) ioctl (fd, TIOCNOTTY, NULL);
κλείσιμο (fd);
}
}
...

Οι δαίμονες είναι σημαντικοί για τον προγραμματισμό συστήματος Linux

Οι δαίμονες είναι προγράμματα που εκτελούν διάφορες ενέργειες με προκαθορισμένο τρόπο που ορίζεται ως απόκριση σε ορισμένα γεγονότα. Λειτουργούν αθόρυβα στον υπολογιστή σας Linux. Δεν βρίσκονται υπό τον άμεσο έλεγχο του χρήστη και κάθε υπηρεσία που εκτελείται στο παρασκήνιο έχει τον δαίμονά της.

Είναι σημαντικό να κατακτήσετε τους δαίμονες για να μάθετε τη δομή του πυρήνα του λειτουργικού συστήματος Linux και να κατανοήσετε τη λειτουργία διαφόρων αρχιτεκτονικών συστημάτων.

Τι είναι ο Δαίμονας;

Διαβάστε Επόμενο

ΜερίδιοΤιτίβισμαΜερίδιοΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ

Σχετικά θέματα

  • Linux
  • Πυρήνας Linux
  • Προγραμματισμός
  • C Προγραμματισμός

Σχετικά με τον Συγγραφέα

Fatih Küçükkarakurt (Δημοσιεύτηκαν 5 άρθρα)

Ένας μηχανικός και προγραμματιστής λογισμικού που είναι λάτρης των μαθηματικών και της τεχνολογίας. Πάντα του άρεσαν οι υπολογιστές, τα μαθηματικά και η φυσική. Έχει αναπτύξει έργα μηχανών παιχνιδιών καθώς και μηχανική μάθηση, τεχνητά νευρωνικά δίκτυα και βιβλιοθήκες γραμμικής άλγεβρας. Επιπλέον, συνεχίζει να εργάζεται σε μηχανική μάθηση και γραμμικούς πίνακες.

Περισσότερα από τον Fatih Küçükkarakurt

Εγγραφείτε στο ενημερωτικό μας δελτίο

Εγγραφείτε στο ενημερωτικό μας δελτίο για συμβουλές τεχνολογίας, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για να εγγραφείτε