Daemons هي عمليات لا تعمل مباشرة تحت سيطرة المستخدم ولكنها تعمل في الخلفية. عادة ، يبدأون عند بدء تشغيل النظام ويعملون بشكل مستمر حتى يتم إيقاف تشغيل النظام. والفرق الوحيد بين هذه العمليات والعمليات العادية هو أنها لا ترسل رسائل إلى وحدة التحكم أو الشاشة بأي شكل من الأشكال.
إليك كيفية إنشاء برنامج خفي على جهاز Linux.
مقدمة موجزة عن كيفية إنشاء Daemons
تعمل الكثير من الشياطين على النظام وبعض أمثلة البرنامج المألوف كالتالي:
- كروند: يجعل الأوامر تعمل في الوقت المحدد
- sshd: يسمح بتسجيل الدخول إلى النظام من الأجهزة البعيدة
- httpd: يخدم صفحات الويب
- nfsd: يسمح بمشاركة الملفات عبر الشبكة
أيضًا ، عادةً ما تتم تسمية العمليات الخفية لتنتهي بالحرف د، على الرغم من أنها ليست إلزامية.
لكي يتم تشغيل العملية كخادم ، يتم اتباع المسار التالي:
- يجب إجراء العمليات الأولية ، مثل قراءة ملفات التكوين أو الحصول على موارد النظام الضرورية ، قبل أن تصبح العملية خفية. بهذه الطريقة ، يمكن للنظام إبلاغ المستخدم بالأخطاء المستلمة وسيتم إنهاء العملية برمز خطأ مناسب.
- يتم إنشاء عملية تشغيل في الخلفية باستخدام init كعملية أصلية. لهذا الغرض ، يتم تقسيم العملية الفرعية من عملية init أولاً ، ثم يتم إنهاء العملية العليا بالخروج.
- يجب فتح جلسة جديدة عن طريق استدعاء وظيفة setid ، ويجب فصل العملية عن الجهاز.
- يتم إغلاق كافة واصفات الملفات المفتوحة الموروثة من العملية الأصلية.
- المدخلات والمخرجات القياسية، ويتم إعادة توجيه رسائل الخطأ إلى /dev/null.
- يجب تغيير دليل العمل للعملية.
ما هي جلسات Daemon؟
بعد تسجيل الدخول إلى النظام عبر المحطة الطرفية ، يمكن للمستخدمين تشغيل العديد من التطبيقات من خلال برنامج shell. يجب إغلاق هذه العمليات عند خروج المستخدم من النظام. يقوم نظام التشغيل بتجميع هذه العمليات في مجموعات الجلسة والعملية.
تتكون كل جلسة من مجموعات العملية. يمكنك وصف هذا الموقف على النحو التالي:
المحطة الطرفية التي تتلقى فيها العمليات مدخلاتها وترسل مخرجاتها تسمى محطة التحكم. ترتبط محطة التحكم بجلسة واحدة فقط في كل مرة.
تحتوي الجلسة ومجموعات العمليات فيها على أرقام تعريف (ID) ؛ أرقام التعريف هذه هي أرقام تعريف العملية (PID) للجلسة وقادة مجموعة العملية. تشترك العملية الفرعية في نفس المجموعة مثل العملية الأصلية الخاصة بها. عندما تكون عمليات متعددة التواصل مع آلية الأنابيب، تصبح العملية الأولى قائد مجموعة العملية.
إنشاء عملية Daemon على Linux
هنا سترى كيف يمكنك إنشاء وظيفة خفي. لهذا الغرض ، سوف تقوم بإنشاء وظيفة باسم _دايمون. يمكنك البدء بتسمية رمز التطبيق الذي سيتم تشغيله كخادم كـ اختبار، والرمز الذي ستنشئ وظيفة البرنامج الخفي باسم الخفي ج.
//test.c
#تضمن <stdio.h>
int_دايمون(int, int);
intالأساسية()
{
getchar () ؛
_ daemon (0، 0) ؛
getchar () ؛
إرجاع0;
}
//daemon.c
#تضمن <sys / types.h>
#تضمن <sys / stat.h>
#تضمن <stdlib.h>
#تضمن <stdio.h>
#تضمن <fcntl.h>
#تضمن <unistd.h>
#تضمن <لينكس / fs.h>
#تضمن <لينكس / limits.h>
int_دايمون(int nochdir int noclose){
pid_t pid ؛
pid = fork () ؛ // تفرع من عملية الوالدين
إذا (pid < 0) {
خروج(EXIT_FAILURE) ،
}
إذا (pid > 0) {
خروج(EXIT_SUCCESS) ،
}
إرجاع0;
}
لإنشاء برنامج خفي ، أنت بحاجة إلى عملية في الخلفية تكون العملية الأصل الخاصة بها هي init. في الكود أعلاه ، _دايمون يخلق عملية فرعية ثم يقتل عملية الوالدين. في هذه الحالة ، ستكون عمليتك الجديدة عملية فرعية لـ init وستستمر في العمل في الخلفية.
الآن قم بتجميع التطبيق باستخدام الأمر التالي وفحص حالة العملية قبلها وبعدها _deamon يسمى:
مجلس التعاون الخليجي-oاختباراختبار.cشيطان.c
قم بتشغيل التطبيق والتبديل إلى محطة طرفية مختلفة دون الضغط على أي مفاتيح أخرى:
./اختبار
يمكنك أن ترى أن القيم المتعلقة بعمليتك هي كما يلي. هنا ، سيتعين عليك استخدام ملفات الأمر ps للحصول على المعلومات المتعلقة بالعملية. في هذه الحالة ، فإن _دايمون لم يتم استدعاء الوظيفة حتى الآن.
ملاحظة - ج اختبار -o "pid ppid pgid sid tty ستاتأمر"
# انتاج
PID PPID PGID SID TT أمر الحالة
10296 5119 10296 5117 نقطة / 2 جنوب /.اختبار
عندما تنظر إلى STAT في الحقل ، ترى أن عمليتك قيد التشغيل ولكنها تنتظر حدوث حدث خارج الجدول الذي سيؤدي إلى تشغيله في المقدمة.
اختصار | المعنى |
س | في انتظار النوم لحدث ما |
تي | توقف التطبيق |
س | قائد الجلسة |
+ | التطبيق قيد التشغيل في المقدمة |
يمكنك أن ترى أن العملية الرئيسية لتطبيقك هي الصدفة كما هو متوقع.
ps -jp 5119
# انتاج
PID PGID SID TTY TIME CMD
5119 5119 5117 نقطة / 2 00:00:02 zsh
عد الآن إلى المحطة حيث تقوم بتشغيل التطبيق الخاص بك واضغط يدخل لاستدعاء _دايمون وظيفة. ثم انظر إلى معلومات العملية على الجهاز الآخر مرة أخرى.
ملاحظة - ج اختبار -o "pid ppid pgid sid tty ستاتأمر"
# انتاج
PID PPID PGID SID TT أمر الحالة
22504 1 22481 5117 نقطة / 2 ثانية /اختبار
بادئ ذي بدء ، يمكنك القول أن العملية الفرعية الجديدة تعمل في الخلفية نظرًا لأنك لا ترى ملف + حرف في STAT ميدان. افحص الآن من هو العملية الأم للعملية باستخدام الأمر التالي:
ps -jp 1
# انتاج
PID PGID SID TTY TIME CMD
1 1 1? 00:00:01systemd
يمكنك الآن أن ترى أن العملية الرئيسية لعمليتك هي ملف systemd معالجة. مذكور أعلاه أنه بالنسبة للخطوة التالية ، يجب فتح جلسة جديدة ويجب فصل العملية عن محطة التحكم. لهذا ، يمكنك استخدام وظيفة مجموعات. أضف هذه المكالمة إلى _دايمون وظيفة.
قطعة الكود المراد إضافتها هي كما يلي:
إذا (سيتسيد () == -1)
إرجاع-1;
الآن بعد أن فتشت الدولة من قبل _دايمون يسمى ، يمكنك الآن إزالة الأول getchar تعمل في اختبار الشفرة.
//test.c
#تضمن <stdio.h>
int_دايمون(int, int);
intالأساسية()
{
_ daemon (0، 0) ؛
getchar () ؛
إرجاع0;
}
بعد تجميع التطبيق وتشغيله مرة أخرى ، انتقل إلى المحطة حيث أجريت مراجعاتك. الحالة الجديدة لعمليتك هي كما يلي:
ملاحظة - ج اختبار -o "pid ppid pgid sid tty ستاتأمر"
# انتاج
PID PPID PGID SID TT أمر الحالة
25494 1 25494 25494? SS. /اختبار
ال ? تسجيل الدخول TT يشير الحقل إلى أن عمليتك لم تعد متصلة بمحطة. لاحظ أن ملف PID, PGID، و SID قيم العملية الخاصة بك هي نفسها. عمليتك هي الآن قائد الجلسة.
في الخطوة التالية ، قم بتغيير دليل العمل إلى الدليل الجذر وفقًا لقيمة الوسيطة التي مررتها. يمكنك إضافة المقتطف التالي إلى ملف _دايمون وظيفة لهذا:
إذا (! nochdir) {
إذا (chdir ("/") == -1)
إرجاع-1;
}
الآن ، وفقًا للحجة التي تم تمريرها ، يمكن إغلاق جميع واصفات الملفات. أضف التعليمات البرمجية التالية إلى ملف _دايمون وظيفة:
#define NR_OPEN 1024
إذا (! noclose) {
لـ (أنا = 0 ؛ أنا < NR_OPEN ، أنا ++)
إغلاق (ط) ؛
افتح("/dev/باطل"، O_RDWR) ؛
دوب (0) ؛
دوب (0) ؛
}
بعد إغلاق جميع واصفات الملفات ، سيتم عرض الملفات الجديدة التي تم فتحها بواسطة البرنامج الخفي مع الواصفات 0 و 1 و 2 على التوالي. في هذه الحالة ، على سبيل المثال ، printf سيتم توجيه الأوامر الموجودة في الكود إلى الملف المفتوح الثاني. لتجنب ذلك ، تشير المعرفات الثلاثة الأولى إلى /dev/null جهاز.
في هذه الحالة ، تكون الحالة النهائية لـ _دايمون ستكون الوظيفة على النحو التالي:
#تضمن <sys / types.h>
#تضمن <sys / stat.h>
#تضمن <stdio.h>
#تضمن <stdlib.h>
#تضمن <fcntl.h>
#تضمن <يخطئ>
#تضمن <unistd.h>
#تضمن <syslog.h>
#تضمن <سلسلة. h>
int_دايمون(فارغ){
// PID: معرف العملية
// SID: معرف الجلسة
pid_t pid ، sid ؛
pid = fork () ؛ // تفرع من عملية الوالدين
إذا (pid < 0) {
خروج(EXIT_FAILURE) ،
}
إذا (pid > 0) {
خروج(EXIT_SUCCESS) ،
}
// خلق أ SIDلطفل
sid = سيتسيد () ؛
إذا (سيد < 0) {
// يفشل
خروج(EXIT_FAILURE) ،
}
إذا ((chdir ("/")) < 0) {
// يفشل
خروج(EXIT_FAILURE) ،
}
إغلاق (STDIN_FILENO) ،
إغلاق (STDOUT_FILENO) ؛
إغلاق (STDERR_FILENO) ،
في حين (1) {
// بعض المهام
ينام (30) ؛
}
خروج(EXIT_SUCCESS) ،
}
فيما يلي مثال على مقتطف التعليمات البرمجية الذي يقوم بتشغيل ملف sshd التطبيق باعتباره أ شيطان:
...
إذا (! (debug_flag || inetd_flag || no_daemon_flag)) {
int فد.
إذا (عفريت (0 ، 0) < 0)
مميت("فشل البرنامج الخفي ():٪ .200s"، strerror (errno)) ؛
/ * قطع الاتصال من tty المسيطر. */
fd = فتح (_PATH_TTY ، O_RDWR | O_NOCTTY) ؛
إذا كان (fd >= 0) {
(فارغ) ioctl (fd، TIOCNOTTY، NULL) ؛
قريب (فد) ؛
}
}
...
Daemons مهمة لبرمجة نظام Linux
Daemons هي برامج تؤدي إجراءات مختلفة بطريقة محددة مسبقًا تم وضعها استجابة لأحداث معينة. تعمل بصمت على جهاز Linux الخاص بك. لا يخضعون للسيطرة المباشرة للمستخدم وكل خدمة تعمل في الخلفية لها شيطانها.
من المهم إتقان الشياطين لتعلم بنية النواة لنظام التشغيل Linux وفهم عمل بنى النظام المختلفة.
ما هو الشيطان؟
اقرأ التالي
مواضيع ذات صلة
- لينكس
- نواة لينكس
- برمجة
- البرمجة C
نبذة عن الكاتب
مهندس ومطور برمجيات من محبي الرياضيات والتكنولوجيا. لطالما أحب الكمبيوتر والرياضيات والفيزياء. لقد طور مشاريع محركات الألعاب بالإضافة إلى التعلم الآلي والشبكات العصبية الاصطناعية ومكتبات الجبر الخطي. علاوة على ذلك ، يواصل العمل على التعلم الآلي والمصفوفات الخطية.
اشترك في نشرتنا الإخبارية
انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!
انقر هنا للاشتراك