الاسم
- Provided by: manpages-ar-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
مكتبة سي المعيارية (libc، -lc)
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim);
int prlimit(pid_t pid, int resource,
const struct rlimit *_Nullable new_limit,
struct rlimit *_Nullable old_limit);
struct rlimit {
rlim_t rlim_cur; /* الحد الناعم */
rlim_t rlim_max; /* الحد الصلب (سقف لـ rlim_cur) */
};
typedef /* ... */ rlim_t; /* Unsigned integer type */
prlimit():
_GNU_SOURCE
استدعاءات النظام getrlimit() و setrlimit() تحصل وتضبط حدود الموارد. كل مورد له حد ناعم وصلب مرتبط به، كما هو معرف بهيكل rlimit.
الحد الناعم هو القيمة التي يفرضها النواة للمورد المقابل. الحد الصلب يعمل كسقف للحد الناعم: عملية غير مميزة يمكنها فقط ضبط حدها الناعم إلى قيمة في النطاق من 0 حتى الحد الصلب، وخفض حدها الصلب (بشكل لا رجعة فيه). عملية مميزة (تحت لينكس: تلك التي تملك قدرة CAP_SYS_RESOURCE في مساحة المستخدم الأولية) يمكنها إجراء تغييرات عشوائية على أي من قيمتي الحد.
القيمة RLIM_INFINITY تشير إلى عدم وجود حد على مورد (سواء في الهيكل الذي يعيده getrlimit() أو في الهيكل الذي يمرر إلى setrlimit()).
وسيطة resource يجب أن تكون واحدة من:
bytes = attr.mq_maxmsg * sizeof(struct msg_msg) +
MIN(attr.mq_maxmsg, MQ_PRIO_MAX) *
sizeof(struct posix_msg_tree_node)+
/* للتحميل الإضافي */
attr.mq_maxmsg * attr.mq_msgsize;
/* لبيانات الرسالة */
بايت = attr.mq_maxmsg * sizeof(struct msg_msg *) +
/* للتراكب */
attr.mq_maxmsg * attr.mq_msgsize;
/* لبيانات الرسالة */
استدعاء النظام الخاص بلينكس prlimit() يجمع ويوسع وظائف setrlimit() و getrlimit(). يمكن استخدامه لتعيين وجلب حدود الموارد لعملية عشوائية.
الوسيطة resource لها نفس المعنى كما في setrlimit() و getrlimit().
إذا كانت الوسيطة new_limit ليست NULL، فسيتم استخدام بنية rlimit التي تشير إليها لتعيين قيم جديدة للحدود الناعمة والصلبة لـ resource. إذا كانت الوسيطة old_limit ليست NULL، فإن استدعاءًا ناجحًا لـ prlimit() يضع الحدود الناعمة والصلبة السابقة لـ resource في بنية rlimit المشار إليها بواسطة old_limit.
الوسيطة pid تحدد معرف العملية التي سيعمل عليها الاستدعاء. إذا كان pid هو 0، فإن الاستدعاء ينطبق على العملية المستدعية. لتعيين أو جلب موارد عملية غير نفسها، يجب أن يكون لدى المستدعي صلاحية CAP_SYS_RESOURCE في مساحة اسم المستخدم للعملية التي يتم تغيير حدود مواردها، أو يجب أن تتطابق معرفات المستخدم الحقيقية والفعالة والمحفوظة للعملية الهدف مع معرف المستخدم الحقيقي للمستدعي و يجب أن تتطابق معرفات المجموعة الحقيقية والفعالة والمحفوظة للعملية الهدف مع معرف المجموعة الحقيقي للمستدعي.
عند النجاح، تُرجع استدعاءات النظام هذه 0. عند الخطأ، يُرجع -1، ويتم تعيين errno للإشارة إلى الخطأ.
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
| الواجهة | السمة | القيمة |
| getrlimit(), setrlimit(), prlimit() | سلامة الخيوط | MT-Safe |
RLIMIT_MEMLOCK و RLIMIT_NPROC مشتقان من BSD وغير محددين في POSIX.1؛ هما موجودان على أنظمة BSD ولينكس، ولكن على عدد قليل من التطبيقات الأخرى. RLIMIT_RSS مشتق من BSD وغير محدد في POSIX.1؛ ومع ذلك فهو موجود على معظم التطبيقات. RLIMIT_MSGQUEUE، RLIMIT_NICE، RLIMIT_RTPRIO، RLIMIT_RTTIME، و RLIMIT_SIGPENDING خاصة بلينكس.
عملية ابنة منشأة عبر fork(2) ترث حدود موارد والديها. حدود الموارد محفوظة عبر execve(2).
حدود الموارد هي سمات لكل عملية مشتركة بين جميع الخيوط في العملية.
خفض الحد الناعم لمورد تحت الاستهلاك الحالي للعملية لذلك المورد سينجح (ولكن سيمنع العملية من زيادة استهلاكها للمورد أكثر).
يمكن للمرء تعيين حدود موارد الصدفة باستخدام الأمر المدمج ulimit (limit في csh(1)). حدود موارد الصدفة موروثة من قبل العمليات التي تنشئها لتنفيذ الأوامر.
منذ لينكس 2.6.24، يمكن فحص حدود موارد أي عملية عبر /proc/pid/limits؛ انظر proc(5).
قدمت الأنظمة القديمة دالة vlimit() بغرض مشابه لـ setrlimit(). للتوافق مع الإصدارات السابقة، يوفر glibc أيضًا vlimit(). يجب كتابة جميع التطبيقات الجديدة باستخدام setrlimit().
منذ glibc 2.13، لم تعد دالتا الغلاف getrlimit() و setrlimit() في glibc تستدعيان استدعاءات النظام المقابلة، بل تستخدمان prlimit() بدلاً من ذلك، للأسباب الموصوفة في BUGS.
اسم دالة الغلاف في glibc هو prlimit()؛ استدعاء النظام الأساسي هو prlimit64().
في أنوية لينكس الأقدم، كانت الإشارات SIGXCPU و SIGKILL التي تُسلم عندما تواجه عملية الحدين الناعم والصلب RLIMIT_CPU تُسلم بعد ثانية (وحدة معالجة مركزية) واحدة مما ينبغي. تم إصلاح هذا في لينكس 2.6.8.
في أنوية لينكس 2.6.x قبل لينكس 2.6.17، يُعامل حد RLIMIT_CPU بقيمة 0 بشكل خاطئ على أنه "بدون حد" (مثل RLIM_INFINITY). منذ لينكس 2.6.17، تعيين حد بقيمة 0 له تأثير، ولكن يُعامل فعليًا كحد قدره ثانية واحدة.
خلل في النواة يعني أن RLIMIT_RTPRIO لا يعمل في لينكس 2.6.12؛ المشكلة مُصلحة في لينكس 2.6.13.
في لينكس 2.6.12، كان هناك عدم تطابق بفارق واحد بين نطاقات الأولوية التي تُرجعها getpriority(2) و RLIMIT_NICE. كان لهذا تأثير أن السقف الفعلي لقيمة nice يُحسب كـ 19 - rlim_cur. تم إصلاح هذا في لينكس 2.6.13.
منذ لينكس 2.6.12، إذا وصلت عملية إلى حدها الناعم RLIMIT_CPU وكان لديها معالج مثبت لـ SIGXCPU، فبالإضافة إلى استدعاء معالج الإشارة، تزيد النواة الحد الناعم بمقدار ثانية واحدة. يتكرر هذا السلوك إذا استمرت العملية في استهلاك وقت وحدة المعالجة المركزية، حتى الوصول إلى الحد الصلب، وعندها تُقتل العملية. لا تغير التطبيقات الأخرى الحد الناعم RLIMIT_CPU بهذه الطريقة، وسلوك لينكس ربما لا يتوافق مع المعايير؛ يجب على التطبيقات المحمولة تجنب الاعتماد على هذا السلوك الخاص بلينكس. يُظهر الحد الخاص بلينكس RLIMIT_RTTIME نفس السلوك عند مواجهة الحد الناعم.
لم تشخص أنوية لينكس قبل 2.4.22 الخطأ EINVAL لـ setrlimit() عندما كانت rlim->rlim_cur أكبر من rlim->rlim_max.
لا يُرجع لينكس خطأً عندما تفشل محاولة تعيين RLIMIT_CPU، لأسباب تتعلق بالتوافق.
تستخدم دالتا الغلاف getrlimit() و setrlimit() في glibc نوع بيانات rlim_t بعرض 64 بت، حتى على منصات 32 بت. ومع ذلك، فإن نوع البيانات rlim_t المستخدم في استدعاءات النظام getrlimit() و setrlimit() هو unsigned long (32 بت). علاوة على ذلك، في لينكس، تمثل النواة حدود الموارد على منصات 32 بت كـ unsigned long. لكن نوع بيانات 32 بت ليس واسعًا بما يكفي. الحد الأكثر صلة هنا هو RLIMIT_FSIZE، الذي يحدد الحجم الأقصى الذي يمكن أن ينمو إليه ملف: ليكون مفيدًا، يجب تمثيل هذا الحد باستخدام نوع بعرض مثل النوع المستخدم لتمثيل إزاحات الملف—أي، بعرض مثل off_t بعرض 64 بت (بافتراض برنامج مُجمّع مع _FILE_OFFSET_BITS=64).
للتحايل على هذا القيد في النواة، إذا حاول برنامج تعيين حد مورد إلى قيمة أكبر مما يمكن تمثيله في unsigned long بعرض 32 بت، فإن دالة الغلاف setrlimit() في glibc حولت قيمة الحد بصمت إلى RLIM_INFINITY. بعبارة أخرى، تم تجاهل إعداد حد المورد المطلوب بصمت.
منذ إصدار glibc 2.13، يتجاوز glibc قيود استدعاءات النظام getrlimit() و setrlimit() عبر تنفيذ setrlimit() و getrlimit() كدوال غلاف تستدعي prlimit().
يوضح البرنامج التالي استخدام prlimit().
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <err.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <time.h>
int
main(int argc, char *argv[])
{
pid_t pid;
struct rlimit old, new;
struct rlimit *newp;
if (!(argc == 2 || argc == 4)) {
fprintf(stderr, "Usage: %s <pid> [<new-soft-limit> "
"<new-hard-limit>]\n", argv[0]);
exit(EXIT_FAILURE);
}
pid = atoi(argv[1]); /* PID of target process */
newp = NULL;
if (argc == 4) {
new.rlim_cur = atoi(argv[2]);
new.rlim_max = atoi(argv[3]);
newp = &new;
}
/* Set CPU time limit of target process; retrieve and display
previous limit */
if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
err(EXIT_FAILURE, "prlimit-1");
printf("Previous limits: soft=%jd; hard=%jd\n",
(intmax_t) old.rlim_cur, (intmax_t) old.rlim_max);
/* Retrieve and display new CPU time limit */
if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
err(EXIT_FAILURE, "prlimit-2");
printf("New limits: soft=%jd; hard=%jd\n",
(intmax_t) old.rlim_cur, (intmax_t) old.rlim_max);
exit(EXIT_SUCCESS);
}
prlimit(1), dup(2), fcntl(2), fork(2), getrusage(2), mlock(2), mmap(2), open(2), quotactl(2), sbrk(2), shmctl(2), malloc(3), sigqueue(3), ulimit(3), core(5), capabilities(7), cgroups(7), credentials(7), signal(7)
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.