$النوم 100 &[1] 9298
يستخدم
com.pidofيمكنك عرض معرف العملية لاسم البرنامج المحدد:
$ بيدوف Sleep9298
$ cat /proc/9298/maps08048000-0804b000 r-xp 00000000 08:01 977399 /bin/sleep0804b000-0804c000 rw -p 00003000 08:01 977399 /bin/sleep0804c000-0806d000 rw-p 0804c000 00:00 0 [الكومة]b7c8b000-b7cca000 r--p 00000000 08:01 443354...bfbd8000-bfbed000 rw-p bfbd8000 00:00 0 [مكدس]ffffe000-ffffff000 r-xp 00000000 00:00 0 [vdso]
بعد تنفيذ البرنامج، يتم تحميله في الذاكرة ويصبح عملية. يوضح ما سبق صورة الذاكرة (الذاكرة الافتراضية) للعملية، بما في ذلك تعليمات البرنامج والبيانات وبعض مساحة المكدس المستخدمة لتخزين معلمات سطر أوامر البرنامج ومتغيرات البيئة التي تم تخصيصها.
للحصول على تفاصيل حول عملية تنفيذ البرنامج في سطر الأوامر، يرجى الرجوع إلى "لحظة تنفيذ البرنامج ضمن سطر أوامر Linux".
في الواقع، هناك طرق أخرى لإنشاء عملية، أي السماح بتشغيل البرنامج. على سبيل المثال، من خلال بعض التكوينات، يمكنك بدء تشغيل البرنامج تلقائيًا عند بدء تشغيل النظام (لمزيد من التفاصيل، راجع
رجل الحرف الأول)، أو عن طريق التكوين
كروند(أو
في) للسماح له ببدء تشغيل البرنامج بانتظام. بالإضافة إلى ذلك، هناك طريقة أخرى وهي كتابة برنامج نصي لـ Shell وكتابة البرنامج في ملف نصي. عند تنفيذ ملف البرنامج النصي، سيتم تنفيذ البرنامج الموجود في الملف ويصبح عملية. لن يتم عرض تفاصيل هذه الطرق، فلنتعرف على كيفية عرض خصائص العملية.
الشيء الوحيد الذي يجب إضافته هو: لتنفيذ البرنامج تحت سطر الأوامر، يمكنك المرور
ulimitتُستخدم الأوامر المضمنة لتعيين الموارد التي يمكن أن تستخدمها العملية، مثل الحد الأقصى لعدد واصفات الملفات التي يمكن للعملية فتحها، والحد الأقصى لمساحة المكدس، ومساحة الذاكرة الافتراضية، وما إلى ذلك. للاستخدام المحدد، انظر
com.helpulimit.
يمكن أن تمر
ملاحظة:استخدم الأمر لعرض السمات والحالة المتعلقة بالعملية. تتضمن هذه المعلومات المستخدم الذي تنتمي إليه العملية، والبرنامج المطابق للعملية
وحدة المعالجة المركزيةواستخدام الذاكرة وغيرها من المعلومات. إن الإلمام بكيفية عرضها يمكن أن يساعد في التحليل الإحصائي ذي الصلة والعمليات الأخرى.
عرض خصائص جميع العمليات الحالية في النظام:
$ ملاحظة -ef
عرض العملية المقابلة للبرنامج الذي يحتوي على حرف معين في الأمر، العملية
بطاقة تعريفهو 1.
TTYل؟ يشير إلى أنه لا علاقة له بالمحطة:
$ ps -C init PID TTY TIME CMD 1 ?
حدد العمليات التي بدأها مستخدم معين:
$ ملاحظة -U الصقر
قم بإخراج المحتوى المحدد وفقًا للتنسيق المحدد، فيما يلي إخراج اسم الأمر و
وحدة المعالجة المركزيةمعدل الاستخدام:
$ ps -e -o %C %c
مطبعة
وحدة المعالجة المركزيةأكثر 4 برامج استخداماً:
$ ps -e -o %C %c |.
احصل على العمليات الخمس باستخدام أكبر ذاكرة افتراضية:
$ ps -e -o %z %c |.
هناك علاقة "قرابة" بين جميع العمليات في النظام، والتي يمكن أن تكون
com.pstreeشاهد هذه العلاقة:
$ بستري
ستتم طباعة شجرة استدعاء عملية النظام أعلاه، ويمكنك أن ترى بوضوح علاقة الاستدعاء بين جميع العمليات النشطة في النظام الحالي.
$ أعلى
أكبر ميزة لهذا الأمر هي أنه يمكنه عرض معلومات العملية ديناميكيًا، كما يوفر أيضًا بعض المعلمات الأخرى، مثل
-سيمكنك فرزها وعرضها وفقًا لوقت التنفيذ التراكمي، أو يمكنك استخدامها
-شعرض العمليات التي بدأها مستخدم محدد، وما إلى ذلك.
تجديد:
قمةالأمر يدعم التفاعلية، على سبيل المثال يدعم
شيعرض الأمر جميع عمليات المستخدم ويدعم التمرير
كأمر بقتل العملية في حالة استخدامها
-ن 1خيار لتمكين وضع معالجة الدفعات، الاستخدام المحدد هو:
$ أعلى - ن 1 - ب
دعونا نناقش مشكلة مثيرة للاهتمام: كيفية تشغيل برنامج واحد فقط في نفس الوقت.
وهذا يعني أنه أثناء تنفيذ البرنامج، لا يمكن تشغيله مرة أخرى. إذن ماذا تفعل؟
إذا تم نسخ نفس البرنامج في عدة نسخ وله أسماء ملفات مختلفة وتم وضعه في مواقع مختلفة، فسيكون ذلك أسوأ، لذا فكر في أبسط حالة، أي أن هذا البرنامج فريد على النظام بأكمله، والاسم فريد أيضًا . في هذه الحالة، ما هي بعض الطرق للإجابة على الأسئلة أعلاه؟
الآلية العامة هي: التحقق في بداية البرنامج من تنفيذه، إذا تم تنفيذه، توقف، وإلا استمر في تنفيذ التعليمات البرمجية اللاحقة.
تتنوع الاستراتيجيات منذ أن ضمن الافتراض السابق تفرد اسم ملف البرنامج ورمزه
ملاحظة:يبحث الأمر عن أسماء البرامج المقابلة لجميع العمليات الحالية ويقارنها باسم البرنامج الخاص به واحدًا تلو الآخر. إذا كان موجودًا بالفعل، فهذا يعني أنه تم تشغيله بالفعل.
ps -e -o %c |.tr -d |.grep -q ^init$ # تحقق مما إذا كان البرنامج الحالي قد تم تنفيذه [ $? -eq 0 ] && Exit # إذا كان الأمر كذلك، فإن $? تم تنفيذه بنجاح
في كل مرة يتم تشغيلها، تحقق أولاً مما إذا كانت هناك عملية تحفظ نفسها في الموقع المحدد.
بطاقة تعريفالملف، إذا لم يكن موجودا، ثم تابع التنفيذ، إذا كان موجودا، ثم عرض العملية
بطاقة تعريفهل هو قيد التشغيل؟ إذا كان الأمر كذلك، قم بالخروج، وإلا أعد كتابة العملية الجديدة إلى الملف.
بطاقة تعريف، واستمر.
pidfile=/tmp/$0.pidif [ -f $pidfile ]; ثم OLDPID=$(cat $pidfile) ps -e -o %p |. grep -q ^$OLDPID$ [ $? &&exitfiecho $$ > $pidfile#... Code body# اضبط إجراء الإشارة 0. عند خروج البرنامج، يتم تشغيل الإشارة لحذف مصيدة الملف المؤقت rm $pidfile 0
لا تتردد في استخدام المزيد من استراتيجيات التنفيذ بنفسك!
بالإضافة إلى ضمان إمكانية تنفيذ كل عملية بسلاسة، من أجل السماح بإكمال مهام معينة أولاً، سيستخدم النظام طرق جدولة معينة عند جدولة العمليات، مثل خوارزمية الجدولة الشائعة لتدوير الشريحة الزمنية حسب الأولوية. في هذه الحالة، يمكنك المرور
رينيسضبط أولوية برنامج قيد التشغيل، على سبيل المثال: `
$ ps -e -o %p %c %n |. grep xfs 5089 xfs 0
$ renice 1 -p 5089renice: 5089: setpriority: العملية غير مسموح بها$ sudo renice 1 -p 5089 # الأذونات مطلوبة [sudo] كلمة المرور لـ falcon:5089: الأولوية القديمة 0، الأولوية الجديدة 1$ ps -e -o %p % c %n |.grep xfs # انظر مرة أخرى، تم تعديل الأولوية 5089 xfs 1
نظرًا لأنه يمكنك تنفيذ برنامج وإنشاء عملية من خلال سطر الأوامر، فهناك أيضًا طريقة لإنهائها. يمكن أن تمر
قتليرسل الأمر إشارة إلى العملية التي بدأها المستخدم لإنهاء العملية بالطبع، فهي "عالمية".
جذربالكاد
قتلجميع العمليات (ما عدا
الحرف الأولالخارج). على سبيل المثال،
$نوم 50 & #بدء عملية [1] 11347 دولار قتل 11347
قتلسيرسل الأمر إشارة إنهاء بشكل افتراضي (
سيجتيرم) إلى البرنامج واترك البرنامج يخرج، ولكن
قتليمكن أيضًا إرسال إشارات أخرى ويمكن تحديدها عبرها
رجل 7 إشارةيمكنك أيضًا مشاهدته من خلال
اقتل -لقائمة بها.
$ man 7 signal$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15 ) سيجتيرم 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) 31) سيجسيس 34) سيجتمين35) سيجرتمين+1 36) سيجتمين+2 37) سيجتمين+3 38) سيجتمين+439) سيجتمين+5 40) سيجتمين+6 41) سيجتمين+7 42) سيجتمين+843) سيجتمين+9 44) سيجرتمين+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) سيجرتماكس-8 57) سيجرتماكس-7 58) سيجرتماكس-659) سيجرتماكس-5 60) سيجرتماكس-4 61) سيجرتماكس-3 62) سيجرتماكس-263) سيجرتماكس-1 64) سيجرتماكس
على سبيل المثال، استخدم
قتلأمر بالإرسال
سيجستوبقم بالإشارة إلى البرنامج للتوقف مؤقتًا ثم إرساله
سيجكونتالإشارة تبقيها قيد التشغيل.
$ Sleep 50 &[1] 11441$ jobs[1]+ Running Sleep 50 &$ kill -s SIGSTOP 11441 # هذا يعادل قيامنا بإجراء عملية CTRL+Z في العملية الأمامية $ jobs[1]+ Stopped Sleep 50$ kill - s SIGCONT 11441 # هذا يعادل عملية bg %1 السابقة التي استخدمناها لتشغيل عملية الخلفية $ jobs[1]+ Running Sleep 50 &$ kill %1 # في ظل الجلسة الحالية، يمكنك أيضًا التحكم في العملية من خلال رقم الوظيفة $ jobs[1]+ إنهاء النوم 50
مرئي
قتليوفر الأمر وظائف جيدة جدًا، لكن لا يمكن أن يعتمد إلا على العملية
بطاقة تعريفأو وظيفة للسيطرة على العملية، في حين
قتلو
killallيتم توفير المزيد من الخيارات التي توسع طرق التحكم في العملية من خلال اسم البرنامج الخاص بها أو حتى اسم المستخدم الخاص بها. يرجى الرجوع إلى أدلةهم لمزيد من الاستخدام.
عند خروج البرنامج كيف يمكن تحديد هل خرج البرنامج بشكل طبيعي أم غير طبيعي؟ هل ما زلت تتذكر تلك الكلاسيكية في نظام Linux؟
مرحبا بالعالمبرنامج؟ يوجد دائمًا سطر في نهاية الكود
العودة 0إفادة. هذا
العودة 0إنه في الواقع يتيح للمبرمج التحقق مما إذا كانت العملية قد خرجت بشكل طبيعي. إذا أعادت العملية قيمة مختلفة، فيمكن القول بأمان أن العملية خرجت بشكل غير طبيعي لأنها لم يتم تنفيذها بعد.
العودة 0يخرج هذا البيان.
فكيف يمكن التحقق من حالة الخروج من العملية، أي القيمة التي تم إرجاعها؟
يخرج
صدَفَة، يمكنك التحقق من هذا المتغير الخاص
$؟الذي يقوم بتخزين حالة الخروج بعد تنفيذ الأمر السابق.
$ test1bash: test1: لم يتم العثور على الأمر$ echo $?127$ cat ./test.c | grep hello$ echo $?1$ cat ./test.c |.grep hi printf(hi, بنفسي!n);$ echo $?0
يبدو أن إرجاع 0 أصبح قاعدة غير معلن عنها، على الرغم من عدم وجود معيار ينص عليها بوضوح، عندما يعود البرنامج بشكل طبيعي، يمكن دائمًا إرجاعه
$؟تم اكتشاف 0 في ، ولكن عندما تكون غير طبيعية، يتم دائمًا اكتشاف قيمة غير 0. يخبرنا هذا أنه في نهاية البرنامج من الأفضل اتباع ما يلي
خروج 0حتى يتمكن أي شخص من اجتياز الاختبار
$؟تحديد ما إذا كان البرنامج سينتهي بشكل طبيعي. إذا قام شخص ما في أحد الأيام باستخدام برنامجك أحيانًا وحاول التحقق من حالة الخروج منه، لكنك قمت بإرجاع ملف
-1أو 1، حينها سيشعر بالضيق الشديد وسيتساءل أين المشكلة في البرنامج الذي كتبه بنفسه، وسيتفحصه لفترة طويلة ولكنه سيكون في حيرة لأنه يثق بك كثيرًا لدرجة أنه لا يشك أبدًا في عاداتك البرمجية. البداية إلى النهاية سوف تكون مختلفة!
لتسهيل التصميم والتنفيذ، عادة ما يتم تقسيم المهمة الكبيرة إلى وحدات أصغر. تصبح الوحدات المختلفة عمليات بعد أن تبدأ، كيف تتواصل مع بعضها البعض لتبادل البيانات والعمل معًا؟ تم ذكر العديد من الأساليب في كتاب "البرمجة المتقدمة في بيئة UNIX"، مثل الأنابيب (الأنابيب غير المسماة والأنابيب المسماة)، والإشارات (
إشارة)، رسالة (
رسالة) قائمة الانتظار (قائمة انتظار الرسائل)، الذاكرة المشتركة (
mmap/munmap)، الإشارة (
إشارة، يستخدم بشكل أساسي للمزامنة، بين العمليات، بين خيوط العملية المختلفة)، المقابس (
المقبس، ودعم عملية الاتصال بين الأجهزة المختلفة)، وما إلى ذلك، وفي شركة شل، عادةً ما يتم استخدام الأنابيب والإشارات بشكل مباشر. يقدم ما يلي بشكل أساسي بعض استخدامات الأنابيب وآليات الإشارة في برمجة Shell.
في نظام Linux، يمكنك المرور
|قم بتوصيل برنامجين بحيث يمكنك استخدامه لربط مدخلات البرنامج الأخير بمخرجات البرنامج السابق، لذلك يطلق عليه بوضوح الأنبوب. في لغة C، من السهل جدًا إنشاء أنبوب غير مسمى
ماسورةوظيفة، ويمر في عنصرين
كثافة العملياتمجموعة من النوع ستفعل. يقوم هذا المصفوفة بالفعل بتخزين واصفين للملفات، بعد أن تكتب العملية الأصلية شيئًا ما إلى واصف الملف الأول، يمكن للعملية الفرعية قراءته من واصف الملف الأول.
إذا كنت تستخدم عددًا كبيرًا جدًا من أسطر الأوامر، فسيتم استخدام هذا الأنبوب
|يجب استخدامه بشكل متكرر. على سبيل المثال، هناك مظاهرة أعلاه
ملاحظة:إخراج الأمر كما
grepإدخال الأمر:
$ ملاحظة -ef |
قد تعتقد أن هذا "الأنبوب" سحري للغاية لدرجة أنه يمكنه بالفعل ربط المدخلات والمخرجات لبرنامجين. كيف يتم تنفيذهما؟ في الواقع، عند إدخال مثل هذه المجموعة من الأوامر، ستقوم الصدفة الحالية بإجراء التحليل المناسب، وربط مخرجات العملية السابقة مع واصف ملف الإخراج للأنبوب، وربط مدخلات العملية اللاحقة مع واصف ملف الإدخال تقوم عملية الارتباط هذه بإعادة توجيه الوظائف من خلال الإدخال والإخراج
مكرر(أو
fcntl) لتحقيق.
الأنبوب المسمى هو في الواقع ملف (الأنبوب غير المسمى يشبه الملف أيضًا. على الرغم من أنه مرتبط باثنين من واصفات الملفات، إلا أنه يمكن قراءته فقط من جانب واحد وكتابته على الجانب الآخر). يجب أن يفي بميزة "الدخول أولاً يخرج أولاً" أثناء التشغيل، وإذا حاولت القراءة من أنبوب مسمى لا يحتوي على محتوى، فسيتم منعك، وبالمثل، إذا حاولت الكتابة إلى أنبوب مسمى ولم يحاول أي برنامج حاليًا لقراءتها، سيتم حظرك. انظر التأثير أدناه.
$ mkfifo fifo_test # أنشئ أنبوبًا مشهورًا من خلال الأمر mkfifo $ echoقليلfefe > fifo_test # محاولة كتابة محتوى إلى ملف fifo_test، لكنه محظور، تحتاج إلى فتح محطة أخرى لمواصلة العمليات التالية $ cat fifo_test #فتح محطة أخرى تذكر، افتح واحدًا آخر. محاولة قراءة محتويات fifo_test عدد قليل من Fefe
هنا
صدىو
قطةهما برنامجان مختلفان، في هذه الحالة، من خلال
صدىو
قطةلا توجد علاقة بين الوالدين والطفل بين العمليتين اللتين بدأتا. ومع ذلك، لا يزال بإمكانهم الاتصال عبر توجيهات الإخراج المسماة.
تعتبر طريقة الاتصال هذه مناسبة جدًا لمواقف معينة: على سبيل المثال، توجد مثل هذه البنية وتتكون هذه البنية من تطبيقين، أحدهما يقرأ بشكل مستمر من خلال الحلقة.
fifo_testالمحتوى من أجل تحديد ما يجب القيام به بعد ذلك. إذا لم يكن هذا الأنبوب يحتوي على محتوى، فسيتم حظره هناك دون استهلاك الموارد بسبب حلقة لا نهائية، وسيستمر الأنبوب الآخر في التدفق كبرنامج تحكم.
fifo_testاكتب بعض معلومات التحكم فيه لإخبار البرنامج السابق بما يجب فعله. اكتب مثالاً بسيطًا جدًا أدناه. يمكنك تصميم بعض رموز التحكم، ومن ثم يستمر برنامج التحكم في ذلك
fifo_testاكتب فيه، ثم يكمل التطبيق إجراءات مختلفة بناءً على رموز التحكم هذه. وبطبيعة الحال، يمكنك أيضا الذهاب إلى
fifo_testقم بإدخال البيانات الأخرى باستثناء رمز التحكم.
رمز التطبيق
$ cat app.sh #!/bin/bash FIFO=fifo_test while :; do CI=`cat $FIFO` #CI --> حالة معلومات التحكم $CI في 0) echo رقم التحكم هو صفر، افعل شيئًا ... ؛؛ 1) صدى رقم التحكم هو واحد، افعل شيئًا ... ؛؛ *) لم يتم التعرف على رقم التحكم، افعل شيئًا آخر... ؛؛
كود برنامج التحكم
$ cat control.sh #!/bin/bash FIFO=fifo_test CI=$1 [ -z $CI ] && echo يجب ألا تكون معلومات التحكم فارغة && خروج echo $CI > $FIFO
يتحكم أحد البرامج في عمل برنامج آخر من خلال الأنابيب
$ chmod +x app.sh control.sh # قم بتعديل الأذونات القابلة للتنفيذ لهذين البرنامجين بحيث يمكن للمستخدمين تنفيذها $ ./app.sh # ابدأ هذا التطبيق في محطة وأرسل التحكم من خلال ./control.sh تحقق من الإخراج بعد الرمز، رقم التحكم هو واحد، افعل شيئًا آخر... # بعد إرسال 1، رقم التحكم هو صفر، افعل شيئًا... # بعد إرسال 0، لم يتم التعرف على رقم التحكم، افعل شيئًا آخر... #أرسل مجهول بعد رمز التحكم $ ./control.sh 1 #في محطة أخرى أرسل معلومات التحكم للتحكم في عمل التطبيق $ ./control.sh 0 $ ./control.sh 4343
تعتبر بنية التطبيقات هذه مناسبة جدًا لتصميم المهام المحلية متعددة البرامج إذا تم دمجها مع
ويب CGI، فسوف يتناسب أيضًا مع متطلبات التحكم عن بعد. يقدم
ويب CGIالتغيير الوحيد هو أن برنامج التحكم
./control.shضع في
الويبل
cgiالدليل وإجراء بعض التعديلات عليه حتى يتوافق مع
CGIالمواصفات، والتي تتضمن تمثيلاً لتنسيق إخراج المستند (يجب إخراجه في بداية الملف
محتوى tpye: نص/htmlوسطر فارغ) والحصول على معلمات الإدخال
(ويبيتم تخزين معلمات الإدخال في
QUERY_STRINGمتغيرات البيئة). لذلك بسيط جدا
CGIيمكن كتابة برنامج التحكم على النحو التالي:
#!/bin/bashFIFO=./fifo_testCI=$QUERY_STRING[ -z $CI ] && echo يجب ألا تكون معلومات التحكم فارغة && Exitecho -e content-type: text/htmlnnecho $CI > $FIFO
في الاستخدام الفعلي، يرجى التأكد
التحكم.shقادرة على الوصول
fifo_testPipe، ولديه أذونات الكتابة للتحكم عبر المتصفح
app.sh:
http://ipaddress_or_dns/cgi-bin/control.sh?0
علامة استفهام
؟المحتوى التالي هو
QUERY_STRING، على غرار السابق
1 دولار.
مثل هذا التطبيق له أهمية عملية كبيرة للتحكم عن بعد، وخاصة التحكم عن بعد في الأنظمة المدمجة. في الدورة الصيفية للعام الماضي، قمنا بتنفيذ التحكم عن بعد في المحركات بهذه الطريقة. أولاً، يتم تنفيذ تطبيق بسيط للتحكم في دوران المحرك، بما في ذلك التحكم في السرعة والاتجاه وما إلى ذلك. ومن أجل تحقيق التحكم عن بعد، قمنا بتصميم بعض رموز التحكم للتحكم في الخصائص المختلفة المتعلقة بدوران المحرك.
في لغة C، إذا كنت تريد استخدام أنبوب مسمى، فهو مشابه لـ Shell، باستثناء أنه عند قراءة البيانات وكتابتها، استخدمها
يقرأ,
يكتباتصل، أنشئ
com.fifoتستخدم عندما
mkfifoاستدعاء وظيفة.
الإشارات عبارة عن مقاطعات برمجية يمكن لمستخدمي Linux الوصول إليها عبرها
قتليرسل الأمر إشارة محددة إلى عملية ما، أو يمكن إرسال بعض الإشارات عبر لوحة المفاتيح، مثل
CTRL+Cقد يؤدي
SGIINTإشارة، في حين
CTRL+قد يؤدي
سيجيكيتالإشارات، وما إلى ذلك. بالإضافة إلى ذلك، سترسل النواة أيضًا إشارات إلى العملية في ظل ظروف معينة، مثل عند الوصول إلى الذاكرة خارج الحدود.
SGISEGVالإشارات، بطبيعة الحال، والعملية نفسها يمكن أن تمر أيضا
قتل,
يرفعانتظر حتى ترسل الوظيفة إشارة إلى نفسها. بالنسبة لأنواع الإشارات المدعومة في نظام التشغيل Linux، يمكنك المرور
رجل 7 إشارةأو
اقتل -لراجع القوائم والتعليمات ذات الصلة.
بالنسبة لبعض الإشارات، سيكون للعملية إجراءات استجابة افتراضية، بينما بالنسبة لبعض الإشارات، قد تتجاهلها العملية ببساطة، ويمكن للمستخدمين أيضًا تعيين وظائف معالجة خاصة لإشارات معينة. في الصدفة، يمكنك المرور
فخالأمر (أمر Shell المدمج) لتعيين إجراء استجابة لإشارة (أمر أو وظيفة محددة)، وفي لغة C يمكنك استخدامه
إشارةاستدعاء وظيفة المعالج المسجلة للإشارة. هذه مجرد مظاهرة
فخاستخدام الأمر.
$ function signal_handler { echo hello,world.; } # تحديد وظيفة signal_handler $ trap signal_handler SIGINT # تنفيذ إعداد الأمر هذا: طباعة مرحبًا، عالم عند تلقي إشارة SIGINT $ مرحبًا، عالم # اضغط على CTRL + C لرؤية الشاشة مرحبًا ويتم إخراج سلاسل العالم
وبالمثل، إذا قمت بتعيين إجراء الاستجابة للإشارة 0، فيمكنك استخدامه
فخلمحاكاة برنامج لغة C
com.atexitتسجيل وظيفة إنهاء البرنامج، أي من خلال
فخ إشارة_معالج SIGQUITتعيين
signal_handlerسيتم تنفيذ الوظيفة عند خروج البرنامج. الإشارة 0 هي إشارة خاصة في
بوسيكس.1يتم تعريف الإشارة رقم 0 على أنها إشارة فارغة، والتي تُستخدم غالبًا لتحديد ما إذا كانت عملية معينة لا تزال موجودة. يتم تشغيل هذه الإشارة عند خروج البرنامج.
$ cat sigexit.sh#!/bin/bashfunction signal_handler { echo hello,world}trap signal_handler 0$ chmod +x sigexit.sh$ ./sigexit.sh # برمجة Shell الفعلية ستستخدم هذه الطريقة للقيام ببعض التنظيف عند خروج البرنامج الانتهاء من العمل على الملفات المؤقتة مرحباً بالعالم
عندما نمرر أوامر متعددة من خلال
|,>,<, ;, (,)عند دمجها معًا، عادةً ما يبدأ تسلسل الأوامر هذا عمليات متعددة تتواصل عبر الأنابيب، وما إلى ذلك. في بعض الأحيان عند تنفيذ مهمة ما، هناك مهام أخرى تحتاج إلى معالجة، لذلك غالبًا ما تضيف & في نهاية تسلسل الأوامر، أو بعد تنفيذ الأمر اضغط على
CTRL+Zيؤدي إلى إيقاف الأمر السابق مؤقتًا. من أجل القيام بمهام أخرى. بعد الانتهاء من بعض المهام الأخرى، تمر
fgيقوم الأمر بتبديل مهمة الخلفية إلى المقدمة. تسمى عملية التحكم هذه عادةً بالتحكم في الوظيفة، وتسمى تسلسلات الأوامر هذه بالوظائف. وقد تتضمن هذه الوظيفة برنامجًا واحدًا أو أكثر، أو عملية واحدة أو أكثر. يوضح ما يلي العديد من عمليات التحكم في الوظائف شائعة الاستخدام.
$ النوم 50 &[1] 11137
استخدم أوامر Shell المضمنة
fgإحضار المهمة 1 إلى المقدمة ثم اضغط
CTRL+Zأوقف العملية مؤقتًا
$ fg %1sleep 50^Z[1]+ توقف النوم 50
وظائف $ # التحقق من حالة الوظيفة الحالية، تم إيقاف وظيفة واحدة [1] + توقف النوم 50 دولارًا نوم 100 & # دع وظيفة أخرى تعمل في الخلفية [2] 11138 دولارًا وظائف # التحقق من حالة الوظيفة الحالية، واحدة قيد التشغيل وواحدة يتم إيقاف [ 1] + توقف النوم 50 [2] - النوم الجاري 100 &
$ bg %1[2]+ نوم 50 &
ومع ذلك، لاستخدام التحكم في الوظيفة ضمن سطر الأوامر، يحتاج الغلاف الحالي وبرنامج تشغيل محطة kernel وما إلى ذلك إلى دعم التحكم في الوظيفة.
"البرمجة المتقدمة في بيئة UNIX"