.\" -*- coding: UTF-8 -*- .\" Copyright 2006, 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 CPU_SET 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم CPU_SET, CPU_CLR, CPU_ISSET, CPU_ZERO, CPU_COUNT, CPU_AND, CPU_OR, CPU_XOR, CPU_EQUAL, CPU_ALLOC, CPU_ALLOC_SIZE, CPU_FREE, CPU_SET_S, CPU_CLR_S, CPU_ISSET_S, CPU_ZERO_S, CPU_COUNT_S, CPU_AND_S, CPU_OR_S, CPU_XOR_S, CPU_EQUAL_S \- كليّات لمعالجة مجموعات CPU .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBvoid CPU_ZERO(cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBvoid CPU_SET(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP \fBvoid CPU_CLR(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP \fBint CPU_ISSET(int \fP\fIcpu\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBint CPU_COUNT(cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBvoid CPU_AND(cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP \fBvoid CPU_OR(cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP \fBvoid CPU_XOR(cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP .P \fBint CPU_EQUAL(cpu_set_t *\fP\fIset1\fP\fB, cpu_set_t *\fP\fIset2\fP\fB);\fP .P \fBcpu_set_t *CPU_ALLOC(int \fP\fInum_cpus\fP\fB);\fP \fBvoid CPU_FREE(cpu_set_t *\fP\fIset\fP\fB);\fP \fBsize_t CPU_ALLOC_SIZE(int \fP\fInum_cpus\fP\fB);\fP .P \fBvoid CPU_ZERO_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBvoid CPU_SET_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP \fBvoid CPU_CLR_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP \fBint CPU_ISSET_S(int \fP\fIcpu\fP\fB, size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBint CPU_COUNT_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset\fP\fB);\fP .P \fBvoid CPU_AND_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP \fBvoid CPU_OR_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP \fBvoid CPU_XOR_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIdestset\fP\fB,\fP \fB cpu_set_t *\fP\fIsrcset1\fP\fB, cpu_set_t *\fP\fIsrcset2\fP\fB);\fP .P \fBint CPU_EQUAL_S(size_t \fP\fIsetsize\fP\fB, cpu_set_t *\fP\fIset1\fP\fB, cpu_set_t *\fP\fIset2\fP\fB);\fP .fi .SH الوصف بنية البيانات \fIcpu_set_t\fP تمثل مجموعة من وحدات CPU. تُستخدم مجموعات CPU بواسطة \fBsched_setaffinity\fP(2) وواجهات مشابهة. .P نوع البيانات \fIcpu_set_t\fP مطبق كقناع بت. ومع ذلك، يجب معاملة بنية البيانات كمعتمة: يجب إجراء جميع معالجات مجموعات CPU عبر الكليّات الموصوفة في هذه الصفحة. .P الكليّات التالية موفرة للعمل على مجموعة CPU \fIset\fP: .TP \fBCPU_ZERO\fP() يمسح \fIset\fP، بحيث لا يحتوي على أي وحدات CPU. .TP \fBCPU_SET\fP() يضيف CPU \fIcpu\fP إلى \fIset\fP. .TP \fBCPU_CLR\fP() أزل المعالج \fIcpu\fP من \fIset\fP. .TP \fBCPU_ISSET\fP() اختبر لترى إذا كان المعالج \fIcpu\fP عضوًا في \fIset\fP. .TP \fBCPU_COUNT\fP() أرجع عدد المعالجات في \fIset\fP. .P حيثما حُددت وسيطة \fIcpu\fP، يجب ألا تُنتج آثارًا جانبية، لأن الدوال الكلية أعلاه قد تُقيّم الوسيطة أكثر من مرة. .P المعالج الأول في النظام يُقابل قيمة \fIcpu\fP تساوي 0، والمعالج التالي يُقابل قيمة \fIcpu\fP تساوي 1، وهكذا. لا ينبغي افتراض توفر معالجات معينة، أو أن مجموعة المعالجات متصلة، لأن المعالجات قد تُؤخذ دون اتصال ديناميكيًا أو تكون غائبة بخلاف ذلك. الثابت \fBCPU_SETSIZE\fP (حاليًا 1024) يُحدد قيمة أكبر بواحد من أقصى رقم معالج يمكن تخزينه في \fIcpu_set_t\fP. .P الدوال الكلية التالية تُنفذ عمليات منطقية على مجموعات المعالجات: .TP \fBCPU_AND\fP() خزّن تقاطع المجموعتين \fIsrcset1\fP و \fIsrcset2\fP في \fIdestset\fP (قد تكون إحدى المجموعتين المصدر). .TP \fBCPU_OR\fP() خزّن اتحاد المجموعتين \fIsrcset1\fP و \fIsrcset2\fP في \fIdestset\fP (قد تكون إحدى المجموعتين المصدر). .TP \fBCPU_XOR\fP() خزّن XOR للمجموعتين \fIsrcset1\fP و \fIsrcset2\fP في \fIdestset\fP (قد تكون إحدى المجموعتين المصدر). XOR تعني مجموعة المعالجات الموجودة إما في \fIsrcset1\fP أو \fIsrcset2\fP، ولكن ليس في كليهما. .TP \fBCPU_EQUAL\fP() اختبر إذا كانت مجموعتا معالجات تحتويان على نفس المعالجات تمامًا. .SS "مجموعات معالجات ذات حجم ديناميكي" لأن بعض التطبيقات قد تتطلب القدرة على تغيير حجم مجموعات المعالجات ديناميكيًا (مثلًا، لتخصيص مجموعات أكبر من تلك المعرفة بنوع البيانات القياسي \fIcpu_set_t\fP)، يوفر glibc حاليًا مجموعة من الدوال الكلية لدعم هذا. .P الدوال الكلية التالية تُستخدم لتخصيص وإلغاء تخصيص مجموعات المعالجات: .TP \fBCPU_ALLOC\fP() يخصص مجموعة معالجات كبيرة كافية لاحتواء معالجات في النطاق 0 إلى \fInum_cpus\-1\fP. .TP \fBCPU_ALLOC_SIZE\fP() ترجع الحجم بالبايت لمجموعة المعالجات اللازمة لاحتواء معالجات في النطاق 0 إلى \fInum_cpus\-1\fP. توفر هذه الكلية القيمة التي يمكن استخدامها للوسيط \fIsetsize\fP في كليات \fBCPU_*_S\fP() الموصوفة أدناه. .TP \fBCPU_FREE\fP() تحرر مجموعة معالجات خصصت سابقًا بواسطة \fBCPU_ALLOC\fP(). .P الكليات التي تنتهي أسماؤها بـ "_S" هي نظائر الكليات المماثلة في الاسم دون اللاحقة. تؤدي هذه الكليات نفس المهام التي تؤديها نظائرها، لكنها تعمل على مجموعة (مجموعات) المعالجات المخصصة ديناميكيًا التي يكون حجمها \fIsetsize\fP بايت. .SH "قيمة الإرجاع" ترجع \fBCPU_ISSET\fP() و \fBCPU_ISSET_S\fP() قيمة غير صفرية إذا كان \fIcpu\fP في \fIset\fP؛ وإلا، ترجع 0. .P ترجع \fBCPU_COUNT\fP() و \fBCPU_COUNT_S\fP() عدد المعالجات في \fIset\fP. .P ترجع \fBCPU_EQUAL\fP() و \fBCPU_EQUAL_S\fP() قيمة غير صفرية إذا كانت مجموعتي المعالجات متساويتين؛ وإلا، ترجعان 0. .P ترجع \fBCPU_ALLOC\fP() مؤشرًا عند النجاح، أو NULL عند الفشل. (الأخطاء مماثلة لتلك الخاصة بـ \fBmalloc\fP(3).) .P ترجع \fBCPU_ALLOC_SIZE\fP() عدد البايتات المطلوبة لتخزين مجموعة معالجات ذات العددية المحددة. .P الدوال الأخرى لا ترجع قيمة. .SH المعايير لينكس. .SH التاريخ أضيفت كليات \fBCPU_ZERO\fP() و \fBCPU_SET\fP() و \fBCPU_CLR\fP() و \fBCPU_ISSET\fP() في glibc 2.3.3. .P ظهرت \fBCPU_COUNT\fP() لأول مرة في glibc 2.6. .P ظهرت \fBCPU_AND\fP() و \fBCPU_OR\fP() و \fBCPU_XOR\fP() و \fBCPU_EQUAL\fP() و \fBCPU_ALLOC\fP() و \fBCPU_ALLOC_SIZE\fP() و \fBCPU_FREE\fP() و \fBCPU_ZERO_S\fP() و \fBCPU_SET_S\fP() و \fBCPU_CLR_S\fP() و \fBCPU_ISSET_S\fP() و \fBCPU_AND_S\fP() و \fBCPU_OR_S\fP() و \fBCPU_XOR_S\fP() و \fBCPU_EQUAL_S\fP() لأول مرة في glibc 2.7. .SH ملاحظات لتكرار مجموعة معالجات، استخدم \fBmemcpy\fP(3). .P بما أن مجموعات المعالجات هي أقنعة بتات مخصصة بوحدات كلمات طويلة، فإن العدد الفعلي للمعالجات في مجموعة معالجات مخصصة ديناميكيًا يُقرّب إلى أعلى مضاعف تالي لـ \fIsizeof(unsigned long)\fP. يجب على التطبيق اعتبار محتويات هذه البتات الإضافية غير معرفة. .P على الرغم من التشابه في الأسماء، لاحظ أن الثابت \fBCPU_SETSIZE\fP يشير إلى عدد المعالجات في نوع البيانات \fIcpu_set_t\fP (وبالتالي، هو عمليًا عدد البتات في قناع البت)، بينما وسيط \fIsetsize\fP لكليات \fBCPU_*_S\fP() هو حجم بالبايت. .P أنواع البيانات للوسائط والقيم المرجعة الموضحة في الملخص هي تلميحات حول ما هو متوقع في كل حالة. ومع ذلك، بما أن هذه الواجهات نُفذت ككليات، فإن المترجم لن يلتقط بالضرورة جميع أخطاء النوع إذا خالفت الاقتراحات. .SH العلل .\" http://sourceware.org/bugzilla/show_bug.cgi?id=7029 على منصات 32\-بت مع glibc 2.8 والإصدارات الأقدم، تخصص \fBCPU_ALLOC\fP() ضعف المساحة المطلوبة، وترجع \fBCPU_ALLOC_SIZE\fP() قيمة أكبر بمرتين مما ينبغي. لا ينبغي أن يؤثر هذا الخلل على دلالات البرنامج، لكنه يؤدي إلى هدر الذاكرة وتشغيل أقل كفاءة للكليات التي تعمل على مجموعات المعالجات المخصصة ديناميكيًا. أُصلحت هذه الأخطاء في glibc 2.9. .SH أمثلة يوضح البرنامج التالي استخدام بعض الكليات المستخدمة لمجموعات المعالجات المخصصة ديناميكيًا. .P .\" SRC BEGIN (CPU_SET.c) .EX #define _GNU_SOURCE #include #include #include #include \& #include \& int main(int argc, char *argv[]) { cpu_set_t *cpusetp; size_t size, num_cpus; \& if (argc < 2) { fprintf(stderr, "Usage: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& num_cpus = atoi(argv[1]); \& cpusetp = CPU_ALLOC(num_cpus); if (cpusetp == NULL) { perror("CPU_ALLOC"); exit(EXIT_FAILURE); } \& size = CPU_ALLOC_SIZE(num_cpus); \& CPU_ZERO_S(size, cpusetp); for (size_t cpu = 0; cpu < num_cpus; cpu += 2) CPU_SET_S(cpu, size, cpusetp); \& printf("CPU_COUNT() of set: %d\[rs]n", CPU_COUNT_S(size, cpusetp)); \& CPU_FREE(cpusetp); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBsched_setaffinity\fP(2)، \fBpthread_attr_setaffinity_np\fP(3)، \fBpthread_setaffinity_np\fP(3)، \fBcpuset\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .