setpgid(2)

الاسم
setpgid, getpgid, setpgrp, getpgrp - ضبط/الحصول على مجموعة العملية

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);

pid_t getpgrp(void);                            /* POSIX.1 version */
[[deprecated]] pid_t getpgrp(pid_t pid);        /* BSD version */

int setpgrp(void);                              /* System V version */
[[deprecated]] int setpgrp(pid_t pid, pid_t pgid);  /* BSD version */

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

getpgid():
    _XOPEN_SOURCE >= 500
        || /* منذ glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

setpgrp() (POSIX.1):
    _XOPEN_SOURCE >= 500
        || /* Since glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _SVID_SOURCE

setpgrp() (BSD), getpgrp() (BSD):
    [These are available only before glibc 2.19]
    _BSD_SOURCE &&
        ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE
            || _GNU_SOURCE || _SVID_SOURCE)

الوصف
جميع هذه الواجهات متاحة على لينكس، وتُستخدم للحصول على وضبط معرف مجموعة العملية (PGID) لعملية. الطرق المفضلة والمحددة بواسطة POSIX.1 للقيام بذلك هي: getpgrp(void)، لاسترجاع PGID للعملية المستدعية؛ و setpgid()، لضبط PGID لعملية.

setpgid() يضبط PGID للعملية المحددة بواسطة pid إلى pgid. إذا كان pid صفرًا، يُستخدم معرف العملية للعملية المستدعية. إذا كان pgid صفرًا، يُجعل PGID للعملية المحددة بواسطة pid مساويًا لمعرف العملية الخاص بها. إذا استُخدم setpgid() لنقل عملية من مجموعة عمليات إلى أخرى (كما تفعل بعض الصدف عند إنشاء خطوط الأنابيب)، يجب أن تكون كلتا مجموعتي العمليات جزءًا من نفس الجلسة (انظر setsid(2) و credentials(7)). في هذه الحالة، يحدد pgid مجموعة عمليات موجودة للانضمام إليها ويجب أن يتطابق معرف جلسة تلك المجموعة مع معرف جلسة العملية المنضمة.

إصدار POSIX.1 من getpgrp()، الذي لا يأخذ وسائط، يُرجع PGID للعملية المستدعية.

getpgid() يُرجع PGID للعملية المحددة بواسطة pid. إذا كان pid صفرًا، يُستخدم معرف العملية للعملية المستدعية. (استرجاع PGID لعملية غير المستدعي نادرًا ما يكون ضروريًا، و getpgrp() من POSIX.1 مفضل لتلك المهمة.)

setpgrp() بنمط System V، الذي لا يأخذ وسائط، يعادل setpgid(0, 0).

استدعاء setpgrp() الخاص بـ BSD، الذي يأخذ وسائط pid و pgid، هو دالة غلاف تستدعي

    setpgid(pid, pgid)

منذ glibc 2.19، لم تعد دالة setpgrp() الخاصة بـ BSD معروضة بواسطة <unistd.h>؛ يجب استبدال الاستدعاءات باستدعاء setpgid() الموضح أعلاه.

استدعاء getpgrp() الخاص بـ BSD، الذي يأخذ وسيطًا واحدًا pid، هو دالة غلاف تستدعي

    getpgid(pid)

منذ glibc 2.19، لم تعد دالة getpgrp() الخاصة بـ BSD معروضة بواسطة <unistd.h>؛ يجب استبدال الاستدعاءات باستدعاءات إلى getpgrp() من POSIX.1 الذي لا يأخذ وسائط (إذا كان القصد هو الحصول على PGID للمستدعي)، أو باستدعاء getpgid() الموضح أعلاه.

قيمة الإرجاع
عند النجاح، تُرجع setpgid() و setpgrp() صفرًا. عند الخطأ، يُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

getpgrp() من POSIX.1 يُرجع دائمًا PGID للمستدعي.

getpgid()، و getpgrp() الخاص بـ BSD يُرجعان مجموعة عمليات عند النجاح. عند الخطأ، يُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EACCES
    جرت محاولة لتغيير معرف مجموعة العملية لأحد أبناء العملية المستدعية وكان الابن قد نفذ بالفعل execve(2) (setpgid()، setpgrp()).

EINVAL
    pgid أقل من 0 (setpgid()، setpgrp()).

EPERM
    جرت محاولة لنقل عملية إلى مجموعة عمليات في جلسة مختلفة، أو لتغيير معرف مجموعة العملية لأحد أبناء العملية المستدعية وكان الابن في جلسة مختلفة، أو لتغيير معرف مجموعة العملية لقائد جلسة (setpgid()، setpgrp()).

EPERM
    مجموعة العملية الهدف غير موجودة. (setpgid()، setpgrp()).

ESRCH
    بالنسبة لـ getpgid(): pid لا يتطابق مع أي عملية. بالنسبة لـ setpgid(): pid ليس العملية المستدعية وليس ابنًا للعملية المستدعية.

المعايير

getpgid()
setpgid()
getpgrp() (بدون وسائط)
    POSIX.1-2024.

setpgrp()
getpgrp() (وسيطة واحدة)
    لا شيء.

التاريخ

getpgid()
setpgid()
getpgrp() (بدون وسائط)
    POSIX.1-2001.

setpgrp() (بدون وسائط)
    POSIX.1-2001. أُهمل في POSIX.1-2008. أُزيل في POSIX.1-2024.

setpgrp() (وسيطتان)
getpgrp() (وسيطة واحدة)
    4.2BSD.

ملاحظات
يرث الطفل المُنشأ عبر fork(2) معرف مجموعة العملية الخاص بوالده. يُحافظ على PGID عبر execve(2).

كل مجموعة عملية هي عضو في جلسة وكل عملية هي عضو في الجلسة التي تكون مجموعتها عضوًا فيها. (انظر credentials(7).)

يمكن أن تحتوي الجلسة على طرفية تحكم. في أي وقت، يمكن لمجموعة عملية واحدة (وواحدة فقط) من مجموعات العمليات في الجلسة أن تكون مجموعة العمليات الأمامية للطرفية؛ أما مجموعات العمليات المتبقية فهي في الخلفية. إذا تولدت إشارة من الطرفية (مثلًا، كتابة مفتاح المقاطعة لتوليد SIGINT)، تُرسل تلك الإشارة إلى مجموعة العمليات الأمامية. (انظر termios(3) لوصف المحارف التي تولد الإشارات.) فقط مجموعة العمليات الأمامية يمكنها read(2) من الطرفية؛ إذا حاولت مجموعة عمليات خلفية read(2) من الطرفية، تُرسل إلى المجموعة إشارة SIGTTIN، والتي تعلقها. تُستخدم الدالتان tcgetpgrp(3) و tcsetpgrp(3) للحصول/تعيين مجموعة العمليات الأمامية للطرفية المتحكمة.

تُستخدم استدعاءات setpgid() و getpgrp() بواسطة برامج مثل bash(1) لإنشاء مجموعات عمليات بهدف تنفيذ التحكم في مهام الصدفة.

إذا تسبب إنهاء عملية في جعل مجموعة عملية يتيمة، وإذا كان أي عضو من مجموعة العمليات اليتيمة الجديدة متوقفًا، فسيُرسل إشارة SIGHUP متبوعة بإشارة SIGCONT إلى كل عملية في مجموعة العمليات اليتيمة الجديدة. مجموعة العمليات اليتيمة هي تلك التي يكون فيها والد كل عضو من مجموعة العملية إما عضوًا في مجموعة العملية نفسها أو عضوًا في مجموعة عملية في جلسة مختلفة (انظر أيضًا credentials(7)).

انظر أيضًا
getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), credentials(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.