تم تصميم العقدة للتعامل مع عمليات الإدخال/الإخراج بكفاءة ، ولكن يجب أن تعلم أن بعض أنواع البرامج ليست مناسبة لهذا الوضع. على سبيل المثال ، إذا كنت تخطط لاستخدام العقدة للتعامل مع مهمة كثيفة وحدة المعالجة المركزية ، فيمكنك حظر حلقة الحدث وبالتالي تقليل استجابة البرنامج. البديل هو تعيين مهام مكثفة في وحدة المعالجة المركزية لعملية منفصلة للتعامل معها ، وبالتالي تحرير حلقة الحدث. تتيح لك العقدة أن تفرخ العملية واستخدام هذه العملية الجديدة كطفل لعملية الأم. في العقدة ، يمكن لعملية الطفل التواصل في اتجاهين مع عملية الوالدين ، وإلى حد ما ، يمكن لعملية الوالدين أيضًا مراقبة عملية الطفل وإدارته.
هناك حالة أخرى تحتاج فيها إلى استخدام عملية الطفل عندما تريد ببساطة تنفيذ أمر خارجي والسماح للعقدة بالحصول على قيمة الإرجاع للأمر. على سبيل المثال ، يمكنك تنفيذ أمر UNIX أو البرنامج النصي أو أوامر أخرى لا يمكن تنفيذها مباشرة في العقدة.
سيوضح لك هذا الفصل كيفية تنفيذ الأوامر الخارجية ، وإنشاء ، والتواصل مع الأطفال ، وإنهاء الأطفال. النقطة المهمة هي أن تمنحك فكرة عن كيفية إكمال سلسلة من المهام خارج عملية العقدة. تنفيذ الأوامر الخارجية عندما تحتاج إلى تنفيذ أمر shell خارجي أو قابل للتنفيذ ، يمكنك استخدام وحدة child_process لاستيرادها على هذا النحو: نسخة الكود كما يلي: var child_process = طلب ('child_process') ثم يمكنك استخدام وظيفة exec في الوحدة لتنفيذ الأوامر الخارجية: نسخة الكود كما يلي: var exec = child_process.exec ؛ exec (الأمر ، رد الاتصال) ؛ المعلمة الأولى من exec هي سلسلة الأوامر shell التي تستعد لتنفيذها ، والمعلمة الثانية هي وظيفة رد الاتصال. سيتم استدعاء وظيفة رد الاتصال هذه عند الانتهاء من تنفيذ أوامر خارجية أو حدوث خطأ. تحتوي وظيفة رد الاتصال على ثلاث معلمات: خطأ ، stdout ، stderr ، انظر المثال التالي: نسخة الكود كما يلي: exec ('ls' ، function (err ، stdout ، stderr) { // ملاحظة المترجم: إذا كنت تستخدم Windows ، فيمكنك تغييره إلى أمر Windows ، مثل Dir ، ولن أكرره لاحقًا. }) ؛ في حالة حدوث خطأ ، ستكون المعلمة الأولى مثيلًا لفئة الخطأ. إذا كانت المعلمة الأولى لا تحتوي على خطأ ، فستحتوي المعلمة الثانية على الإخراج القياسي للأمر. تحتوي المعلمة الأخيرة على إخراج الخطأ المتعلق بالأمر. إدراج 8-1 يعرض مثالًا أكثر تعقيدًا على تنفيذ الأوامر الخارجية قائمة 8-1: تنفيذ الأوامر الخارجية (رمز المصدر: الفصل 8/01_EXTERNAL_COMMAND.JS) نسخة الكود كما يلي: // استيراد وظيفة exec لوحدة child_process var exec = required ('child_process'). exec ؛ // استدعاء الأمر "Cat *.js | wc -l" exec ('cat *.js | wc l' ، function (err ، stdout ، stderr) {// line 4 // يخرج الأمر أو فشل المكالمة إذا (خطأ) { // فشل في بدء عملية خارجية console.log ('child_process exit ، رمز الخطأ هو:' ، err.code) ؛ يعود؛ } } في السطر الرابع ، نمر "Cat *.js | wc -l" كمعلمة الأولى إلى Exec. يمكنك أيضًا تجربة أي أمر آخر ، طالما أن الأمر الذي استخدمته في القشرة على ما يرام. ثم خذ وظيفة رد الاتصال كمعلمة ثانية ، والتي سيتم استدعاؤها عند حدوث خطأ أو تنتهي عملية الطفل. يمكنك أيضًا تمرير معلمة اختيارية ثالثة قبل وظيفة رد الاتصال ، والتي تحتوي على بعض خيارات التكوين ، مثل: نسخة الكود كما يلي: var exec = required ('child_process'). exec ؛ خيارات var = { مهلة: 1000 ، Killsignal: 'sigkill' } ؛ exec ('cat *.js | wc l' ، خيارات ، وظيفة (err ، stdout ، stderr) { // ... }) ؛ المعلمات التي يمكن استخدامها هي: 1.cwd - الدليل الحالي ، يمكنك تحديد دليل العمل الحالي. 2. الترميز-تنسيق الترميز لمحتوى إخراج عملية الطفل ، القيمة الافتراضية هي "UTF8" ، أي ترميز UTF-8. إذا لم يكن إخراج عملية الطفل UTF8 ، فيمكنك استخدام هذه المعلمة لتعيينها. تنسيقات الترميز المدعومة هي: نسخة الكود كما يلي: ASCII UTF8 UCS2 BASE64 إذا كنت تريد معرفة المزيد عن تنسيقات الترميز هذه التي تدعمها العقدة ، فيرجى الرجوع إلى الفصل 4 "باستخدام المخزن المؤقت للمعالجة والترميز وفك تشفير البيانات الثنائية". 1.Timeout - مهلة تنفيذ الأوامر بالميلي ثانية ، الافتراضي هو 0 ، أي ، لا يوجد حد ، وانتظر حتى تنتهي عملية الطفل. 2.MaxBuffer - يحدد الحد الأقصى لعدد البايتات المسموح به بواسطة دفق Stdout ودفق Stderr. إذا تم الوصول إلى أقصى قيمة ، فسيتم قتل عملية الطفل. القيمة الافتراضية هي 200*1024. 3. KillSignal - إشارة النهاية المرسلة إلى عملية الطفل عندما تصل المهلة أو ذاكرة التخزين المؤقت للإخراج إلى الحد الأقصى للقيمة. القيمة الافتراضية هي "Sigterm" ، والتي سترسل إشارة إنهاء إلى عملية الطفل. عادة ما يستخدم هذا لإنهاء العملية بطريقة منظمة. عند استخدام إشارات SIGTERM ، يمكن للعملية أيضًا معالجة أو إعادة كتابة السلوك الافتراضي لمعالج الإشارة بعد استلامه. إذا كانت العملية المستهدفة تحتاج إليها ، فيمكنك تمرير إشارات أخرى إليها في نفس الوقت (مثل SIGUSR1). يمكنك أيضًا اختيار إرسال إشارة sigkill ، والتي سيتم معالجتها بواسطة نظام التشغيل وإجبار عملية الطفل على الفور ، حتى لا يتم تنفيذ أي عملية تنظيف لعملية الطفل. إذا كنت ترغب في التحكم في نهاية العملية ، فيمكنك استخدام أمر child_process.spawn ، والذي سيتم تقديمه لاحقًا. 1.evn - يحدد متغير البيئة الذي تم نقله إلى عملية الطفل. الافتراضي هو NULL ، مما يعني أن عملية الطفل سترث متغيرات البيئة لجميع عمليات الوالدين قبل إنشائها. ملاحظة: باستخدام خيار KillSignal ، يمكنك إرسال إشارات إلى العملية المستهدفة كسلسلة. في العقدة ، توجد الإشارة كسلسلة. فيما يلي قائمة بإشارات UNIX والعمليات الافتراضية المقابلة: قد ترغب في توفير مجموعة من متغيرات البيئة الوالدين القابلة للتمديد لعملية الطفل. إذا قمت بتعديل العملية مباشرة. ENV ، فسوف تقوم بتغيير متغيرات البيئة لجميع الوحدات النمطية في عملية العقدة ، مما سيؤدي إلى الكثير من المتاعب. البديل هو إنشاء كائن جديد ونسخ جميع المعلمات في Process.env ، انظر المثال 8-2: القائمة 8-2: استخدم متغيرات البيئة المعلمة لتنفيذ الأوامر (رمز المصدر: الفصل 8/02_env_vars_augment.js) نسخة الكود كما يلي: var env = process.env ، varname ، Envcopy = {} ، exec = طلب ('child_process'). exec ؛ // copy process.env to Envcopy لـ (vaname in ev) { Envcopy [varname] = env [varname] ؛ } // اضبط بعض المتغيرات المخصصة Envcopy ['custom env var1'] = 'بعض القيمة' ؛ Envcopy ['custom env var2'] = 'بعض القيمة الأخرى' ؛ // تنفيذ الأوامر باستخدام Process.ENV والمتغيرات المخصصة exec ('ls la' ، {env: envcopy} ، function (err ، stdout ، stderr) { if (err) {throw err ؛ } console.log ('stdout:' ، stdout) ؛ console.log ('stderr:' ، stderr) ؛ } في المثال أعلاه ، يتم إنشاء متغير Envcopy لتوفير متغيرات البيئة. يقوم أولاً بنسخ متغيرات البيئة لعملية العقدة من Process.ENV ، ثم يضيف أو يستبدل بعض متغيرات البيئة التي تحتاج إلى تعديل ، وأخيراً تمرير Envcopy كمعلمة متغيرة للبيئة إلى وظيفة EXEC وتنفذ الأوامر الخارجية. تذكر أن متغيرات البيئة يتم تمريرها بين العمليات من خلال نظام التشغيل ، وأن جميع أنواع القيم المتغيرة للبيئة تصل إلى عملية الطفل كسلاسل. على سبيل المثال ، إذا أخذت عملية الأصل الرقم 123 كمتغير للبيئة ، فستتلقى عملية الطفل "123" كسلسلة. في المثال التالي ، سيتم إنشاء برامج نصية للعقدة في نفس الدليل: Parent.js و Child.js. السيناريو الأول سوف يتصل بالثاني. دعنا ننشئ هذين الملفان: القائمة 8-3: عملية الأصل تحدد متغيرات البيئة (الفصل 8/03_environment_number_parent.js) نسخة الكود كما يلي: var exec = required ('child_process'). exec ؛ exec ('node child.js' ، {env: {number: 123}} ، function (err ، stdout ، stderr) { if (err) {throw err ؛ } console.log ('stdout:/n' ، stdout) ؛ console.log ('stderr:/n' ، stderr) ؛ }) ؛ احفظ هذا الرمز إلى Parent.js. ما يلي هو الكود المصدري لعملية الطفل وحفظه إلى child.js (انظر المثال 8-4) مثال 8-4: تخفيضات البيئة المتخلفات الفرعية (الفصل 8/04_ENVIRINMENT_NUMBER_CHILD.JS) نسخة الكود كما يلي: var number = process.env.number ؛ console.log (typeof (number)) ؛ // → "سلسلة" رقم = parseint (رقم ، 10) ؛ console.log (typeof (number)) ؛ // → "الرقم" بعد حفظ هذا الملف كـ child.js ، يمكنك تشغيل الأمر التالي في هذا الدليل: نسخة الكود كما يلي: $ node parent.js سترى الإخراج التالي: نسخة الكود كما يلي: sdtou: خيط رقم Stderr: كما ترون ، على الرغم من أن العملية الأصل تمرر متغيرًا للبيئة الرقمية ، فإن عملية الطفل تستقبلها كسلسلة (انظر السطر الثاني من الإخراج) ، وفي السطر الثالث ، يمكنك تحليل السلسلة في رقم. توليد عملية الطفل كما ترون ، يمكنك استخدام وظيفة child_process.exec () لبدء عملية خارجية والاتصال بوظيفة رد الاتصال في نهاية العملية. هذا بسيط للغاية للاستخدام ، ولكن هناك بعض العيوب: 1. بالإضافة إلى استخدام معلمات سطر الأوامر ومتغيرات البيئة ، لا يمكن أن يتواصل exec () مع عمليات الطفل. 2. إخراج عملية الطفل محاكاة مؤقتًا ، لذلك لا يمكنك بثه ، فقد ينفد من الذاكرة لحسن الحظ ، تتيح وحدة Node's Child_Process أن تحكم الدقة الدقيقة بالتحكم في بدء التشغيل والتوقف والعمليات التقليدية الأخرى لعمليات الأطفال. يمكنك بدء عملية طفل جديدة في التطبيق. توفر Node قناة اتصال ثنائية الاتجاه ، مما يسمح للعمليات الوالد والطفل بإرسال واستلام بيانات السلسلة من بعضها البعض. يمكن أن يكون لعملية الوالدين أيضًا بعض عمليات الإدارة لعملية الطفل ، وإرسال إشارات إلى عملية الطفل ، وإغلاق عملية الطفل بقوة. إنشاء عملية طفل يمكنك استخدام وظيفة child_process.spawn لإنشاء عملية جديدة للطفل ، انظر المثال 8-5: مثال 8-5: إنشاء عملية الطفل. (الفصل 8/05_Spawning_Child.js) نسخة الكود كما يلي: // استيراد وظيفة تفرخ وحدة child_process var تفرخ = مطلوب ('child_process'). تفرخ ؛ // إنشاء عمليات الطفل المستخدمة لتنفيذ الأمر "tail -f /var/log/system.log" var Child = Spawn ('tail' ، ['-f' ، '/var/log/system.log']) ؛ يقوم الرمز أعلاه بإنشاء عملية طفل تستخدم لتنفيذ أوامر الذيل ويأخذ "-f" و "/bar/log/system.log" كمعلمات. سيقوم الأمر Tail بمراقبة ملف /var/log/system.og (إذا كان موجودًا) ، ثم إخراج جميع البيانات الجديدة التي تم إلحاقها إلى دفق الإخراج القياسي Stdout. تُرجع دالة تفرخ كائن معالجة الطفل ، وهو كائن مؤشر ، ويغلف واجهة الوصول للعملية الحقيقية. في هذا المثال ، نقوم بتعيين هذا الواصف الجديد لمتغير يسمى الطفل. استمع إلى البيانات من عمليات الطفل سيأخذ أي مقبض للطفل الذي يحتوي على سمة stdout الإخراج القياسي لعملية الطفل ككائن تيار. يمكنك ربط حدث البيانات على كائن الدفق هذا ، بحيث يتم استدعاء وظيفة رد الاتصال المقابل ، انظر المثال التالي: كلما توفرت كتلة البيانات ، راجع المثال التالي: نسخة الكود كما يلي: // طباعة إخراج عملية الطفل إلى وحدة التحكم child.stdout.on ('data' ، function (data) { console.log ('إخراج الذيل:' + البيانات) ؛ }) ؛ عندما تقوم عملية الطفل بإخراج البيانات إلى stdout الإخراج القياسي ، يتم إخطار العملية الأصل وطباعة البيانات على وحدة التحكم. بالإضافة إلى الإخراج القياسي ، تحتوي العملية على دفق إخراج افتراضي آخر: دفق الخطأ القياسي ، والذي يتم استخدامه عادة لإخراج معلومات الخطأ. في هذا المثال ، إذا لم يكن ملف /var/log/system.log غير موجود ، فستقوم عملية الذيل بإخراج رسالة مماثلة لما يلي: "/var/log/system.log: لا يوجد مثل هذا الملف أو الدليل". من خلال الاستماع إلى دفق Stderr ، سيتم إخطار العملية الأصل عند حدوث هذا الخطأ. يمكن أن تستمع العملية الأصل إلى تدفقات الخطأ القياسية مثل هذا: نسخة الكود كما يلي: child.stderr.on ('Data' ، function (data) { console.log ("إخراج خطأ الذيل: '، البيانات) ؛ }) ؛ خاصية Stderr ، مثل stdout ، هي أيضًا دفق للقراءة فقط. عندما تقوم عملية الطفل بإخراج البيانات في دفق الخطأ القياسي ، سيتم إخطار عملية الأصل وإخراج البيانات. إرسال البيانات إلى عملية الطفل بالإضافة إلى استلام البيانات من دفق الإخراج لعملية الطفل ، يمكن لعملية الوالدين أيضًا كتابة البيانات في الإدخال القياسي لعملية الطفل من خلال ilingpoces.stdin الخاصية لإرسال البيانات إلى عملية الطفل. يمكن لعملية الطفل الاستماع إلى بيانات الإدخال القياسية من خلال العملية. Stdin Dream-Read-on فقط ، ولكن كن حذرًا من أنه يجب عليك أولاً استئناف دفق الإدخال القياسي ، لأنه في حالة توقف مؤقتًا بشكل افتراضي. مثال 8-6 سيقوم بإنشاء برنامج يحتوي على الوظائف التالية: 1.+1 تطبيق: تطبيق بسيط يمكن أن يتلقى أعداد صحيحة من الإدخال القياسي ، ثم إضافتها ، ثم إخراج النتيجة بعد إضافة دفق الإخراج القياسي. كخدمة حوسبة بسيطة ، يحاكي هذا التطبيق عملية العقدة كخدمة خارجية يمكنها أداء مهام محددة. 2. اختبر عميل تطبيق +1 ، أرسل عددًا صحيحًا عشوائيًا ، ثم إخراج النتيجة. تستخدم لتوضيح كيفية توليد عملية العقدة عملية طفل ثم يتيح لها أداء مهام محددة. استخدم الكود التالي في المثال 8-6 لإنشاء ملف يسمى Plus_One.js: مثال 8-6: +1 تطبيق (الفصل 8/06_PLUS_ONE.JS) نسخة الكود كما يلي: // استعادة دفق الإدخال القياسي الذي يتم إيقافه مؤقتًا افتراضيًا process.stdin.resume () ؛ Process.stdin.on ('Data' ، function (data) { رقم var ؛ يحاول { // تحليل بيانات الإدخال في عدد صحيح رقم = parseint (data.toString () ، 10) ؛ // +1 رقم += 1 ؛ // نتيجة الإخراج process.stdout.write (رقم + "/n") ؛ } catch (err) { process.stderr.write (err.message + "/n") ؛ } }) ؛ في الكود أعلاه ، ننتظر البيانات من دفق الإدخال القياسي Stdin. كلما توفرت البيانات ، نفترض أنها عدد صحيح وتحليلها في متغير عدد صحيح ، ثم أضف 1 ، وإخراج النتيجة إلى دفق الإخراج القياسي. يمكنك تشغيل هذا البرنامج من خلال الأمر التالي: نسخة الكود كما يلي: $ node plus_one.js بعد الجري ، يبدأ البرنامج في انتظار الإدخال. إذا قمت بإدخال عدد صحيح واضغط على Enter ، فسترى رقمًا بعد إضافته 1 ليتم عرضه على الشاشة. يمكنك الخروج من البرنامج عن طريق الضغط على CTRL-C. عميل اختبار أنت الآن تريد إنشاء عملية عقدة لاستخدام خدمات الحوسبة التي توفرها "Application +1" السابق. قم أولاً بإنشاء ملف يسمى Plus_One_test.js ، انظر المثال 8-7: مثال 8-7: اختبار +1 التطبيق (الفصل 8/07_PLUS_ONE_TEST.JS) نسخة الكود كما يلي: var تفرخ = مطلوب ('child_process'). تفرخ ؛ // إنشاء عملية طفل لتنفيذ تطبيق +1 var child = Spawn ('node' ، ['plus_one.js']) ؛ // استدعاء الوظيفة كل ثانية setInterval (function () { // إنشاء رقم عشوائي أصغر من 10.000 var number = math.floor (math.random () * 10000) ؛ // أرسل هذا الرقم إلى عملية الطفل: child.stdin.write (رقم + "/n") ؛ // احصل على استجابة من عملية الطفل وطباعتها: child.stdout.once ('data' ، function (data) { console.log ('child يرد على' + number + 'مع:' + data) ؛ }) ؛ } ، 1000) ؛ child.stderr.on ('Data' ، function (data) { process.stdout.write (data) ؛ }) ؛ من السطر الأول إلى السطر الرابع ، بدأت عملية الطفل في تشغيل "تطبيق +1" ، ثم يتم تنفيذ العمليات التالية كل ثانية باستخدام وظيفة setInterval: 1. إنشاء رقم عشوائي جديد أقل من 10000 2. تمرير هذا الرقم كسلسلة لعملية الطفل 3. انتظر عملية الطفل للرد على سلسلة 4. لأنك تريد أن تتلقى رقمًا واحدًا فقط في وقت واحد ، فأنت بحاجة إلى استخدام child.stod.once بدلاً من child.stod.on. إذا تم استخدام هذا الأخير ، فسيتم تسجيل وظيفة رد الاتصال لحدث بيانات كل ثانية واحدة. سيتم تنفيذ كل وظيفة رد اتصال مسجل عندما يتلقى stdout لعملية الطفل البيانات. وبهذه الطريقة ، ستجد أن نفس نتيجة الحساب سيتم إخراجها عدة مرات. من الواضح أن هذا السلوك خاطئ. تلقي الإخطارات عندما تخرج عملية الطفل عندما تخرج عملية الطفل ، سيتم إطلاق حدث الخروج. مثال 8-8 يوضح كيفية الاستماع إليه: مثال 8-8: استمع إلى حدث الخروج من عملية الطفل (الفصل 8/09_Listen_Child_exit.js) نسخة الكود كما يلي: var تفرخ = مطلوب ('child_process'). تفرخ ؛ // إنشاء عملية الطفل لتنفيذ أمر "LS -LA" var child = تفرخ ('ls' ، ['-la']) ؛ child.stdout.on ('data' ، function (data) { console.log ('بيانات من الطفل:' + البيانات) ؛ }) ؛ // عندما تخرج عملية الطفل: <strong> child.on ('exit' ، function (code) { console.log ("عملية الطفل التي تم إنهاءها بالرمز" + رمز) ؛ }) ؛ </strong> في الأسطر القليلة الأخيرة من الكود الأسود ، تستخدم عملية الوالدين حدث خروج عملية الطفل للاستماع لحدث خروجها. عند حدوث الحدث ، تعرض وحدة التحكم الإخراج المقابل. سيتم تمرير رمز الخروج من عملية الطفل إلى وظيفة رد الاتصال كمعلمة الأولى. تستخدم بعض البرامج رمز خروج غير 0 لتمثيل حالة فشل معينة. على سبيل المثال ، إذا حاولت تنفيذ الأمر "ls al click filename.txt" ، لكن الدليل الحالي لا يحتوي على هذا الملف ، فستحصل على رمز خروج بقيمة 1 ، انظر المثال 8-9: مثال 8-9: الحصول على رمز الخروج من عملية الطفل (الفصل 8/10_child_exit_code.js) نسخة الكود كما يلي: var تفرخ = مطلوب ('child_process'). تفرخ ؛ // إنشاء عملية الطفل وتنفيذ الأمر var child = تفرخ ('ls' ، ['do_not_exist.txt']) ؛ // عندما تخرج عملية الطفل child.on ('exit' ، function (code) { console.log ("عملية الطفل التي تم إنهاءها بالرمز" + رمز) ؛ }) ؛ في هذا المثال ، يؤدي حدث الخروج إلى تشغيل وظيفة رد الاتصال ويمرر رمز خروج عملية الطفل كمعلمة أول لها. إذا خرجت عملية الطفل بشكل غير طبيعي بسبب قتلها بواسطة إشارة ، فسيتم نقل رمز الإشارة المقابل إلى وظيفة رد الاتصال كمعلمة ثانية ، كما في المثال 8-10: القائمة 8-10: احصل على إشارة الخروج لعملية الطفل (الفصل 8/11_child_exit_signal.js) نسخة الكود كما يلي: var تفرخ = مطلوب ('child_process'). تفرخ ؛ // إنشاء عملية الطفل وقم بتشغيل أمر "Sleep 10" var child = تفرخ ('النوم' ، ['10']) ؛ setTimeout (function () { child.kill () ؛ } ، 1000) ؛ child.on ('exit' ، function (code ، signal) { إذا (رمز) { console.log ("عملية الطفل التي تم إنهاءها بالرمز" + رمز) ؛ } آخر إذا (إشارة) { console.log ("عملية الطفل التي تم إنهاءها بسبب إشارة + إشارة) ؛ } }) ؛ في هذا المثال ، بدأت عملية الطفل في أداء النوم 10 ثوانٍ ، ولكن يتم إرسال إشارة سيجكل إلى عملية الطفل قبل 10 ثوانٍ ، مما سيؤدي إلى الإخراج التالي: نسخة الكود كما يلي: تم إنهاء عملية الطفل بسبب الإشارة sigterm أرسل إشارة وقتل العملية في هذا القسم ، سوف تتعلم كيفية استخدام الإشارات لإدارة العمليات الفرعية. الإشارات هي وسيلة سهلة لعملية الوالدين للتواصل مع الأطفال وحتى قتل الأطفال. تمثل رموز الإشارات المختلفة معانيًا مختلفة ، وهناك العديد من الإشارات ، بعضها هي الأكثر شيوعًا المستخدمة لقتل العمليات. إذا تلقيت العملية إشارة إلى أنها لا تعرف كيفية التعامل ، فسيتم مقاطعة البرنامج بالاستثناء. تتم معالجة بعض الإشارات عن طريق العمليات الفرعية ، بينما لا يمكن معالجة البعض الآخر إلا بواسطة نظام التشغيل. بشكل عام ، يمكنك استخدام طريقة ilder.kill لإرسال إشارة إلى عملية الطفل ، وإرسال إشارة sigterm بشكل افتراضي: نسخة الكود كما يلي: var تفرخ = مطلوب ('child_process'). تفرخ ؛ var child = تفرخ ('النوم' ، ['10']) ؛ setTimeout (function () { child.kill () ؛ } ، 1000) ؛ يمكنك أيضًا إرسال إشارة محددة عن طريق تمرير سلسلة تحدد الإشارة باعتبارها المعلمة الوحيدة لطريقة القتل: نسخة الكود كما يلي: child.kill ('sigusr2') ؛ تجدر الإشارة إلى أنه على الرغم من أن اسم هذه الطريقة هو القتل ، فإن إشارة المرسلة لا تقتل بالضرورة عملية الطفل. إذا قام الطفل بمعالجة الإشارة ، فقد تم كتابة سلوك الإشارة الافتراضي. يمكن للعمليات الفرعية المكتوبة في العقدة إعادة كتابة تعريف معالج الإشارة مثل ما يلي: نسخة الكود كما يلي: Process.on ('sigusr2' ، function () { console.log ('حصلت على إشارة sigusr2') ؛ }) ؛ الآن ، قمت بتعريف معالج إشارة SIGUSR2. عندما تتلقى عمليتك إشارة sigusr2 مرة أخرى ، لن يتم قتلها ، ولكن بدلاً من ذلك يخرج الجملة "حصلت على إشارة sigusr2". باستخدام هذه الآلية ، يمكنك تصميم طريقة بسيطة للتواصل مع عملية الطفل أو حتى قيادةها. على الرغم من أنها ليست غنية مثل استخدام الإدخال القياسي ، إلا أن هذه الطريقة أبسط بكثير. ملخص في هذا الفصل ، تعلمنا استخدام طريقة child_process.exec لتنفيذ الأوامر الخارجية. وبهذه الطريقة ، يمكننا نقل المعلمات إلى عملية الطفل بدلاً من استخدام معلمات سطر الأوامر ، ولكن بدلاً من ذلك نحدد متغيرات البيئة. لقد تعلمت أيضًا كيفية إنشاء عمليات الطفل عن طريق الاتصال بالطريقة child_process.spawn للاتصال بالأوامر الخارجية. وبهذه الطريقة ، يمكنك استخدام تدفقات الإدخال وتدفقات الإخراج للتواصل مع عمليات الطفل ، أو استخدام إشارات للتواصل مع عمليات الطفل وقتل العمليات.