.\" -*- coding: UTF-8 -*- .\" Copyright 2010, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH posix_spawn 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم posix_spawn, posix_spawnp \- إنجاب عملية .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint posix_spawn(pid_t *restrict \fP\fIpid\fP\fB, const char *restrict \fP\fIpath\fP\fB,\fP \fB const posix_spawn_file_actions_t *restrict \fP\fIfile_actions\fP\fB,\fP \fB const posix_spawnattr_t *restrict \fP\fIattrp\fP\fB,\fP \fB char *const \fP\fIargv\fP\fB[restrict],\fP \fB char *const \fP\fIenvp\fP\fB[restrict]);\fP \fBint posix_spawnp(pid_t *restrict \fP\fIpid\fP\fB, const char *restrict \fP\fIfile\fP\fB,\fP \fB const posix_spawn_file_actions_t *restrict \fP\fIfile_actions\fP\fB,\fP \fB const posix_spawnattr_t *restrict \fP\fIattrp\fP\fB,\fP \fB char *const \fP\fIargv\fP\fB[restrict],\fP \fB char *const \fP\fIenvp\fP\fB[restrict]);\fP .fi .SH الوصف تُستخدم الدالتان \fBposix_spawn\fP() و\fBposix_spawnp\fP() لإنشاء عملية تابعة جديدة تنفذ ملفًا محددًا. وُصفت هاتان الدالتان بواسطة POSIX لتوفير طريقة موحدة لإنشاء عمليات جديدة على آلات تفتقر إلى القدرة على دعم استدعاء النظام \fBfork\fP(2). هذه الآلات هي عمومًا أنظمة مضمنة صغيرة تفتقر إلى دعم MMU. .P توفر الدالتان \fBposix_spawn\fP() و\fBposix_spawnp\fP() وظائف مدمجة لـ \fBfork\fP(2) و\fBexec\fP(3)، مع بعض خطوات الصيانة الاختيارية في العملية التابعة قبل \fBexec\fP(3). لا يُقصد من هاتين الدالتين استبدال استدعاءات النظام \fBfork\fP(2) و\fBexecve\fP(2). في الواقع، توفران فقط مجموعة فرعية من الوظائف التي يمكن تحقيقها باستخدام استدعاءات النظام. .P الفرق الوحيد بين \fBposix_spawn\fP() و\fBposix_spawnp\fP() هو الطريقة التي تحددان بها الملف الذي ستنفذه العملية التابعة. مع \fBposix_spawn\fP()، يُحدد الملف القابل للتنفيذ كاسم مسار (يمكن أن يكون مطلقًا أو نسبيًا). مع \fBposix_spawnp\fP()، يُحدد الملف القابل للتنفيذ كاسم ملف بسيط؛ يبحث النظام عن هذا الملف في قائمة الدلائل المحددة بواسطة \fBPATH\fP (بنفس طريقة \fBexecvp\fP(3)). لبقية هذه الصفحة، تُصاغ المناقشة من حيث \fBposix_spawn\fP()، مع فهم أن \fBposix_spawnp\fP() يختلف فقط في النقطة الموصوفة للتو. .P الوسائط المتبقية لهاتين الدالتين هي كما يلي: .TP \fIpid\fP يشير إلى مخزن مؤقت يُستخدم لإرجاع معرف العملية للعملية التابعة الجديدة. .TP \fIfile_actions\fP يشير إلى \fIكائن إجراءات ملف الإنجاب\fP الذي يحدد الإجراءات المتعلقة بالملف التي ستنفذ في التابع بين خطوتي \fBfork\fP(2) و\fBexec\fP(3). يُهيأ هذا الكائن ويُملأ قبل استدعاء \fBposix_spawn\fP() باستخدام \fBposix_spawn_file_actions_init\fP(3) ودوال \fBposix_spawn_file_actions_*\fP(). .TP \fIattrp\fP يشير إلى \fIكائن سمات\fP يحدد سمات مختلفة للعملية التابعة المنشأة. يُهيأ هذا الكائن ويُملأ قبل استدعاء \fBposix_spawn\fP() باستخدام \fBposix_spawnattr_init\fP(3) ودوال \fBposix_spawnattr_*\fP(). .TP \fIargv\fP .TQ \fIenvp\fP يحددان قائمة الوسائط والبيئة للبرنامج الذي ينفذ في العملية التابعة، كما في \fBexecve\fP(2). .P أدناه، تُوصف الدوال من حيث عملية من ثلاث خطوات: خطوة \fBfork\fP()، خطوة ما قبل \fBexec\fP() (تُنفذ في التابع)، وخطوة \fBexec\fP() (تُنفذ في التابع). .SS "خطوة fork()" منذ glibc 2.24، تبدأ دالة \fBposix_spawn\fP() باستدعاء \fBclone\fP(2) مع علمي \fBCLONE_VM\fP و\fBCLONE_VFORK\fP. تستخدم التطبيقات الأقدم \fBfork\fP(2)، أو ربما \fBvfork\fP(2) (انظر أدناه). .P يُوضع PID العملية التابعة الجديدة في \fI*pid\fP. ثم تُعيد دالة \fBposix_spawn\fP() التحكم إلى العملية الأم. .P لاحقًا، يمكن للأب استخدام إحدى استدعاءات النظام الموصوفة في \fBwait\fP(2) للتحقق من حالة العملية الابن. إذا فشل الابن في أي من خطوات الصيانة الموصوفة أدناه، أو فشل في تنفيذ الملف المطلوب، فإنه يخرج بحالة 127. .P قبل glibc 2.24، تُنشأ العملية الابن باستخدام \fBvfork\fP(2) بدلاً من \fBfork\fP(2) عندما يكون أي مما يلي صحيحًا: .IP \[bu] 3 عنصر \fIspawn\-flags\fP لكائن السمات المشار إليه بواسطة \fIattrp\fP يحتوي على العلم الخاص بـ GNU \fBPOSIX_SPAWN_USEVFORK\fP؛ أو .IP \[bu] \fIfile_actions\fP هو NULL وعنصر \fIspawn\-flags\fP لكائن السمات المشار إليه بواسطة \fIattrp\fP لا \fIيحتوي\fP على \fBPOSIX_SPAWN_SETSIGMASK\fP، \fBPOSIX_SPAWN_SETSIGDEF\fP، \fBPOSIX_SPAWN_SETSCHEDPARAM\fP، \fBPOSIX_SPAWN_SETSCHEDULER\fP، \fBPOSIX_SPAWN_SETPGROUP\fP، أو \fBPOSIX_SPAWN_RESETIDS\fP. .P بعبارة أخرى، يُستخدم \fBvfork\fP(2) إذا طلبه المتصل، أو إذا لم يكن هناك تنظيف متوقع في الابن قبل أن ينفذ \fBexec\fP(3) الملف المطلوب. .SS "خطوة ما قبل التنفيذ (pre\-exec()): الصيانة" بين خطوتي \fBfork()\fP و \fBexec()\fP، قد تحتاج العملية الابن إلى أداء مجموعة من إجراءات الصيانة. تدعم الدالتان \fBposix_spawn\fP() و \fBposix_spawnp\fP() مجموعة صغيرة ومحددة جيدًا من مهام النظام التي يمكن للعملية الابن إنجازها قبل تنفيذ الملف القابل للتنفيذ. تُتحكم هذه العمليات بواسطة كائن السمات المشار إليه بواسطة \fIattrp\fP وكائن إجراءات الملف المشار إليه بواسطة \fIfile_actions\fP. في الابن، تُجرى المعالجة بالتسلسل التالي: .IP (1) 5 إجراءات سمات العملية: تُغير قناع الإشارة، والمعالجات المبدئية للإشارة، وخوارزمية الجدولة ومعاملاتها، ومجموعة العملية، ومعرفات المستخدم والمجموعة الفعلية كما هو محدد بواسطة كائن السمات المشار إليه بواسطة \fIattrp\fP. .IP (2) تُنفذ إجراءات الملف، كما هو محدد في وسيط \fIfile_actions\fP، بالترتيب الذي حُددت به باستخدام استدعاءات دوال \fBposix_spawn_file_actions_add*\fP(). .IP (3) تُغلق واصفات الملفات التي تحتوي على العلم \fBFD_CLOEXEC\fP. .P جميع سمات العملية في الابن، بخلاف تلك المتأثرة بالسمات المحددة في الكائن المشار إليه بواسطة \fIattrp\fP وإجراءات الملف في الكائن المشار إليه بواسطة \fIfile_actions\fP، ستتأثر كما لو أن الابن أُنشئ باستخدام \fBfork\fP(2) ونفذ البرنامج باستخدام \fBexecve\fP(2). .P تُعرف إجراءات سمات العملية بواسطة كائن السمات المشار إليه بواسطة \fIattrp\fP. يتحكم سمة \fIspawn\-flags\fP (المعينة باستخدام \fBposix_spawnattr_setflags\fP(3)) في الإجراءات العامة التي تحدث، وتحدد السمات الأخرى في الكائن القيم التي ستُستخدم خلال تلك الإجراءات. .P تأثيرات الأعلام التي قد تُحدد في \fIspawn\-flags\fP هي كما يلي: .TP \fBPOSIX_SPAWN_SETSIGMASK\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setsigmask (3)) يضبط قناع الإشارة على مجموعة الإشارات المحددة في سمة \fIspawn\-sigmask\fP للكائن المشار إليه بواسطة \fIattrp\fP. إذا لم يُعيّن العلم \fBPOSIX_SPAWN_SETSIGMASK\fP، فإن الابن يرث قناع إشارة الأب. .TP \fBPOSIX_SPAWN_SETSIGDEF\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setsigdefault (3)) يعيد ضبط ترتيب جميع الإشارات في المجموعة المحددة في سمة \fIspawn\-sigdefault\fP للكائن المشار إليه بواسطة \fIattrp\fP إلى المبدئي. لمعالجة ترتيبات الإشارات غير المحددة في سمة \fIspawn\-sigdefault\fP، أو المعالجة عندما لا يُحدد \fBPOSIX_SPAWN_SETSIGDEF\fP، انظر \fBexecve\fP(2). .TP \fBPOSIX_SPAWN_SETSCHEDPARAM\fP .\" (POSIX_PRIORITY_SCHEDULING only) .\" FIXME . .\" (see .\" .BR posix_spawnattr_setschedparam (3)) إذا عُيّن هذا العلم، ولم يُعيّن العلم \fBPOSIX_SPAWN_SETSCHEDULER\fP، فاضبط معاملات الجدولة على المعاملات المحددة في سمة \fIspawn\-schedparam\fP للكائن المشار إليه بواسطة \fIattrp\fP. .TP \fBPOSIX_SPAWN_SETSCHEDULER\fP اضبط خوارزمية سياسة الجدولة ومعاملات الطفل، كما يلي: .RS .IP \[bu] 3 .\" FIXME . .\" (see .\" .BR posix_spawnattr_setpolicy (3)) تُضبط سياسة الجدولة إلى القيمة المحددة في السمة \fIspawn\-schedpolicy\fP للكائن المشار إليه بواسطة \fIattrp\fP. .IP \[bu] .\" FIXME . .\" (see .\" .BR posix_spawnattr_setschedparam (3)) تُضبط معاملات الجدولة إلى القيمة المحددة في السمة \fIspawn\-schedparam\fP للكائن المشار إليه بواسطة \fIattrp\fP (ولكن انظر الأخطاء). .P إذا لم تُحدد العلمان \fBPOSIX_SPAWN_SETSCHEDPARAM\fP و \fBPOSIX_SPAWN_SETSCHEDPOLICY\fP، يرث الطفل سمات الجدولة المقابلة من الوالد. .RE .TP \fBPOSIX_SPAWN_RESETIDS\fP إذا وُضعت هذه العلامة، أعد ضبط UID و GID الفعليين إلى UID و GID الحقيقيين لعملية الوالد. إذا لم توضع هذه العلامة، يحتفظ الطفل بـ UID و GID الفعليين للوالد. في كلتا الحالتين، إذا كانت بتات صلاحية set\-user\-ID و set\-group\-ID مفعلة في الملف القابل للتنفيذ، فسيغلب تأثيرها ضبط UID و GID الفعليين (انظر \fBexecve\fP(2)). .TP \fBPOSIX_SPAWN_SETPGROUP\fP .\" FIXME . .\" (see .\" .BR posix_spawnattr_setpgroup (3)) اضبط مجموعة العملية إلى القيمة المحددة في السمة \fIspawn\-pgroup\fP للكائن المشار إليه بواسطة \fIattrp\fP. إذا كانت قيمة السمة \fIspawn\-pgroup\fP تساوي 0، يُجعل معرف مجموعة عملية الطفل مساويًا لمعرف عمليته. إذا لم توضع علامة \fBPOSIX_SPAWN_SETPGROUP\fP، يرث الطفل معرف مجموعة عملية الوالد. .TP \fBPOSIX_SPAWN_USEVFORK\fP منذ glibc 2.24، ليس لهذه العلامة أي تأثير. في التطبيقات الأقدم، يفرض وضع هذه العلامة استخدام خطوة \fBfork()\fP لـ \fBvfork\fP(2) بدلاً من \fBfork\fP(2). يجب تعريف ماكرو اختبار الميزة \fB_GNU_SOURCE\fP للحصول على تعريف هذا الثابت. .TP \fBPOSIX_SPAWN_SETSID\fP (منذ glibc 2.26) .\" This flag has been accepted in POSIX, see: .\" http://austingroupbugs.net/view.php?id=1044 .\" and has been implemented since glibc 2.26 .\" commit daeb1fa2e1b33323e719015f5f546988bd4cc73b إذا وُضعت هذه العلامة، يجب على عملية الطفل إنشاء جلسة جديدة وتصبح قائدة الجلسة. يجب أيضًا على عملية الطفل أن تصبح قائدة مجموعة العملية الجديدة في الجلسة (انظر \fBsetsid\fP(2)). يجب تعريف ماكرو اختبار الميزة \fB_GNU_SOURCE\fP للحصول على تعريف هذا الثابت. .P .\" mtk: I think we probably don't want to say the following, since it .\" could lead people to do the wrong thing .\" The POSIX standard tells you to call .\" this function to de-initialize the attributes object pointed to by .\" .I attrp .\" when you are done with it; .\" however, on Linux systems this operation is a no-op. إذا كان \fIattrp\fP فارغًا (NULL)، فتُطبق السلوكيات المبدئية الموصوفة أعلاه لكل علامة. .P تحدد وسيطة \fIfile_actions\fP سلسلة من عمليات الملف التي تُنفذ في عملية الطفل بعد المعالجة العامة الموصوفة أعلاه، وقبل تنفيذها لـ \fBexec\fP(3). إذا كان \fIfile_actions\fP فارغًا (NULL)، فلا يُتخذ أي إجراء خاص، وتُطبق دلالات \fBexec\fP(3) القياسية\[em]تبقى واصفات الملفات المفتوحة قبل exec مفتوحة في العملية الجديدة، باستثناء تلك التي وُضعت لها علامة \fBFD_CLOEXEC\fP. تظل أقفال الملفات في مكانها. .P .\" FIXME . I think the following is best placed in the .\" posix_spawn_file_actions_adddup2(3) page, and a similar statement is .\" also needed in posix_spawn_file_actions_addclose(3) .\" Note that you can specify file descriptors in .\" .I posix_spawn_file_actions_adddup2 (3) .\" which would not be usable if you called .\" .BR dup2 (2) .\" at that time--i.e., file descriptors that are opened or .\" closed by the earlier operations .\" added to .\" .I file_actions . إذا لم يكن \fIfile_actions\fP فارغًا (NULL)، فإنه يحتوي على مجموعة مرتبة من الطلبات لملفات \fBopen\fP(2) و \fBclose\fP(2) و \fBdup2\fP(2). تُضاف هذه الطلبات إلى \fIfile_actions\fP بواسطة \fBposix_spawn_file_actions_addopen\fP(3) و \fBposix_spawn_file_actions_addclose\fP(3) و \fBposix_spawn_file_actions_adddup2\fP(3). تُنفذ العمليات المطلوبة بالترتيب الذي أُضيفت به إلى \fIfile_actions\fP. .P إذا فشل أي من إجراءات الصيانة (بسبب تمرير قيم زائفة أو أسباب أخرى قد تفشل فيها معالجة الإشارات، وجدولة العمليات، ودوال معرف مجموعة العملية، وعمليات واصف الملف)، تخرج عملية الطفل بقيمة خروج 127. .SS "خطوة exec()" بمجرد أن يتفرع الطفل بنجاح وينفذ جميع خطوات ما قبل exec المطلوبة، يشغل الطفل الملف القابل للتنفيذ المطلوب. .P تأخذ عملية الطفل بيئتها من وسيطة \fIenvp\fP، التي تُفسر كما لو أنها مُررت إلى \fBexecve\fP(2). تأتي وسيطات العملية المنشأة من وسيطة \fIargv\fP، التي تُعالج كما في \fBexecve\fP(2). .SH "قيمة الإرجاع" عند الإكمال بنجاح، تضع \fBposix_spawn\fP() و \fBposix_spawnp\fP() معرف عملية الطفل (PID) في \fIpid\fP، وتُرجع 0. إذا حدث خطأ أثناء خطوة \fBfork()\fP، فلا يُنشأ أي طفل، وتكون محتويات \fI*pid\fP غير محددة، وتُرجع هاتان الدالتان رقم خطأ كما هو موصوف أدناه. .P حتى عندما تُرجع هذه الدوال حالة نجاح، فقد تَفشَل العملية الابن لأسباب عديدة تتعلق بتهيئتها قبل \fBexec\fP(). بالإضافة إلى ذلك، قد يَفشَل \fBexec\fP(3). في كل هذه الحالات، ستَخْرُج العملية الابن بقيمة خروج 127. .SH الأخطاء تَفْشَل الدالتان \fBposix_spawn\fP() و\fBposix_spawnp\fP() فقط في حالة فَشَل استدعاء \fBfork\fP(2) أو \fBvfork\fP(2) أو \fBclone\fP(2) الأساسي؛ في هذه الحالات، تُرجع هاتان الدالتان رقم خطأ، والذي سيكون أحد الأخطاء الموصوفة لـ \fBfork\fP(2) أو \fBvfork\fP(2) أو \fBclone\fP(2). .P بالإضافة إلى ذلك، تَفْشَل هذه الدوال إذا: .TP \fBENOSYS\fP الدالة غير مدعومة على هذا النظام. .SH المعايير POSIX.1\-2008. .SH التاريخ .\" FIXME . This piece belongs in spawnattr_setflags(3) .\" The .\" .B POSIX_SPAWN_USEVFORK .\" flag is a GNU extension; the .\" .B _GNU_SOURCE .\" feature test macro must be defined (before including any header files) .\" to obtain the definition of this constant. glibc 2.2. POSIX.1\-2001. .SH ملاحظات أنشطة الصيانة في الابن تُتحكم بها الكائنات المشار إليها بواسطة \fIattrp\fP (للإجراءات غير المتعلقة بالملفات) و\fIfile_actions\fP. في اصطلاح POSIX، يُشار إلى نوعي البيانات \fIposix_spawnattr_t\fP و\fIposix_spawn_file_actions_t\fP ككائنات، وعناصرها غير محددة بالاسم. يجب على البرامج المحمولة تهيئة هذه الكائنات باستخدام الدوال المحددة بواسطة POSIX فقط. (بمعنى آخر، على الرغم من أن هذه الكائنات قد تُنفذ كهياكل تحتوي على حقول، يجب على البرامج المحمولة تجنب الاعتماد على تفاصيل التنفيذ هذه.) .P .\" Tested on glibc 2.12 وفقًا لـ POSIX، من غير المحدد ما إذا كانت معالجات fork المنشأة بـ \fBpthread_atfork\fP(3) تُستدعى عند استدعاء \fBposix_spawn\fP(). منذ glibc 2.24، لا تُنفذ معالجات fork في أي حالة. في التطبيقات الأقدم، تُستدعى معالجات fork فقط إذا أُنشئ الابن باستخدام \fBfork\fP(2). .P لا توجد دالة "posix_fspawn" (أي دالة تكون لـ \fBposix_spawn\fP() كما \fBfexecve\fP(3) لـ \fBexecve\fP(2)). ومع ذلك، يمكن الحصول على هذه الوظيفة بتحديد معامل \fIpath\fP كأحد الملفات في دليل \fI/proc/self/fd\fP للمستدعي. .SH العلل .\" http://sourceware.org/bugzilla/show_bug.cgi?id=12052 ينص POSIX.1 على أنه عندما يُحدد \fBPOSIX_SPAWN_SETSCHEDULER\fP في \fIspawn\-flags\fP، فإن \fBPOSIX_SPAWN_SETSCHEDPARAM\fP (إن وُجد) يُتجاهل. ومع ذلك، قبل glibc 2.14، فَشِلَت استدعاءات \fBposix_spawn\fP() بخطأ إذا حُدد \fBPOSIX_SPAWN_SETSCHEDULER\fP دون تحديد \fBPOSIX_SPAWN_SETSCHEDPARAM\fP أيضًا. .SH أمثلة يُوضح البرنامج أدناه استخدام دوال متنوعة في واجهة برمجة تطبيقات spawn في POSIX. يقبل البرنامج سمات سطر أوامر يمكن استخدامها لإنشاء كائنات إجراءات ملفات وسمات. تُستخدم وسائط سطر الأوامر المتبقية كاسم الملف التنفيذي ووسائط سطر أوامر البرنامج الذي يُنفذ في الابن. .P في التشغيل الأول، يُنفذ أمر \fBdate\fP(1) في الابن، ولا يستخدم استدعاء \fBposix_spawn\fP() أي كائنات إجراءات ملفات أو سمات. .P .in +4n .EX $\fB ./a.out date\fP; PID of child: 7634 Tue Feb 1 19:47:50 CEST 2011 Child status: exited, status=0 .EE .in .P في التشغيل التالي، يُستخدم خيار سطر الأوامر \fI\-c\fP لإنشاء كائن إجراءات ملفات يُغلق الإخراج القياسي في الابن. وبالتالي، يَفشَل \fBdate\fP(1) عند محاولة تنفيذ الإخراج ويخرج بحالة 1. .P .in +4n .EX $\fB ./a.out \-c date\fP; PID of child: 7636 date: write error: Bad file descriptor Child status: exited, status=1 .EE .in .P في التشغيل التالي، يُستخدم خيار سطر الأوامر \fI\-s\fP لإنشاء كائن سمات يُحدد أن جميع الإشارات (القابلة للحظر) في الابن يجب أن تُحظر. وبالتالي، فَشَل محاولة قتل الابن بالإشارة الافتراضية المرسلة بواسطة \fBkill\fP(1) (أي \fBSIGTERM\fP)، لأن تلك الإشارة محظورة. لذلك، لقتل الابن، \fBSIGKILL\fP ضرورية (لا يمكن حظر \fBSIGKILL\fP). .P .in +4n .EX $\fB ./a.out \-s sleep 60 &\fP [1] 7637 $ PID of child: 7638 .P $\fB kill 7638\fP; $\fB kill \-KILL 7638\fP; $ Child status: killed by signal 9 [1]+ Done ./a.out \-s sleep 60 .EE .in .P عندما نحاول تنفيذ أمر غير موجود في الابن، يَفشَل \fBexec\fP(3) ويخرج الابن بحالة 127. .P .in +4n .EX $\fB ./a.out xxxxx\fP; PID of child: 10190 Child status: exited, status=127 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (posix_spawn.c) \& .EX #include #include #include #include #include #include #include #include #include \& char **environ; \& int main(int argc, char *argv[]) { pid_t child_pid; int s, opt, status; sigset_t mask; posix_spawnattr_t attr; posix_spawnattr_t *attrp; posix_spawn_file_actions_t file_actions; posix_spawn_file_actions_t *file_actionsp; \& /* Parse command\-line options, which can be used to specify an attributes object and file actions object for the child. */ \& attrp = NULL; file_actionsp = NULL; \& while ((opt = getopt(argc, argv, "sc")) != \-1) { switch (opt) { case \[aq]c\[aq]: /* \-c: close standard output in child */ \& /* Create a file actions object and add a "close" action to it. */ \& s = posix_spawn_file_actions_init(&file_actions); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawn_file_actions_init"); \& s = posix_spawn_file_actions_addclose(&file_actions, STDOUT_FILENO); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawn_file_actions_addclose"); \& file_actionsp = &file_actions; break; \& case \[aq]s\[aq]: /* \-s: block all signals in child */ \& /* Create an attributes object and add a "set signal mask" action to it. */ \& s = posix_spawnattr_init(&attr); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawnattr_init"); s = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawnattr_setflags"); \& sigfillset(&mask); s = posix_spawnattr_setsigmask(&attr, &mask); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawnattr_setsigmask"); \& attrp = &attr; break; } } \& if (argv[optind] == NULL) { fprintf(stderr, "Usage: %s [\-cs] executable [args]\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& /* Spawn the child. The name of the program to execute and the command\-line arguments are taken from the command\-line arguments of this program. The environment of the program execed in the child is made the same as the parent\[aq]s environment. */ \& s = posix_spawnp(&child_pid, argv[optind], file_actionsp, attrp, &argv[optind], environ); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawn"); \& /* Destroy any objects that we created earlier. */ \& if (attrp != NULL) { s = posix_spawnattr_destroy(attrp); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawnattr_destroy"); } \& if (file_actionsp != NULL) { s = posix_spawn_file_actions_destroy(file_actionsp); if (s != 0) errc(EXIT_FAILURE, s, "posix_spawn_file_actions_destroy"); } \& printf("PID of child: %jd\[rs]n", (intmax_t) child_pid); \& /* Monitor status of the child until it terminates. */ \& do { s = waitpid(child_pid, &status, WUNTRACED | WCONTINUED); if (s == \-1) err(EXIT_FAILURE, "waitpid"); \& printf("Child status: "); if (WIFEXITED(status)) { printf("exited, status=%d\[rs]n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("killed by signal %d\[rs]n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("stopped by signal %d\[rs]n", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("continued\[rs]n"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" .\" Disable hyphenation .nh .ad l \fBclose\fP(2), \fBdup2\fP(2), \fBexecl\fP(2), \fBexeclp\fP(2), \fBfork\fP(2), \fBopen\fP(2), \fBsched_setparam\fP(2), \fBsched_setscheduler\fP(2), \fBsetpgid\fP(2), \fBsetuid\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBposix_spawn_file_actions_addclose\fP(3), \fBposix_spawn_file_actions_adddup2\fP(3), \fBposix_spawn_file_actions_addopen\fP(3), \fBposix_spawn_file_actions_destroy\fP(3), \fBposix_spawn_file_actions_init\fP(3), \fBposix_spawnattr_destroy\fP(3), \fBposix_spawnattr_getflags\fP(3), \fBposix_spawnattr_getpgroup\fP(3), \fBposix_spawnattr_getschedparam\fP(3), \fBposix_spawnattr_getschedpolicy\fP(3), \fBposix_spawnattr_getsigdefault\fP(3), \fBposix_spawnattr_getsigmask\fP(3), \fBposix_spawnattr_init\fP(3), \fBposix_spawnattr_setflags\fP(3), \fBposix_spawnattr_setpgroup\fP(3), \fBposix_spawnattr_setschedparam\fP(3), \fBposix_spawnattr_setschedpolicy\fP(3), \fBposix_spawnattr_setsigdefault\fP(3), \fBposix_spawnattr_setsigmask\fP(3), \fBpthread_atfork\fP(3), \fI\fP, Base Definitions volume of POSIX.1\-2001, \fIhttp://www.opengroup.org/unix/online.html\fP .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .