.\" -*- coding: UTF-8 -*- .\" Copyright 2012, Cyrill Gorcunov .\" Copyright 2012-2016, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Kernel commit d97b46a64674a267bc41c9e16132ee2a98c3347d .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH kcmp 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم kcmp \- مقارنة عمليتين لتحديد ما إذا كانتا تشاركان مورد نواة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP /* Definition of \fBKCMP_*\fP constants */ \fB#include \fP /* Definition of \fBSYS_*\fP constants */ \fB#include \fP .P \fBint syscall(SYS_kcmp, pid_t \fP\fIpid1\fP\fB, pid_t \fP\fIpid2\fP\fB, int \fP\fItype\fP\fB,\fP \fB unsigned long \fP\fIidx1\fP\fB, unsigned long \fP\fIidx2\fP\fB);\fP .fi .P \fIملاحظة\fP: لا توفر glibc غلافًا لـ \fBkcmp\fP()، مما يستلزم استخدام \fBsyscall\fP(2). .SH الوصف يمكن استخدام استدعاء النظام \fBkcmp\fP() للتحقق مما إذا كانت العمليتان المحددتان بواسطة \fIpid1\fP و \fIpid2\fP تشاركان مورد نواة مثل الذاكرة الافتراضية، وواصفات الملفات، وما إلى ذلك. .P يخضع الإذن لاستخدام \fBkcmp\fP() لفحوصات وضع الوصول ptrace \fBPTRACE_MODE_READ_REALCREDS\fP ضد كل من \fIpid1\fP و \fIpid2\fP؛ انظر \fBptrace\fP(2). .P تحدد الوسيطة \fItype\fP أي مورد سيتم مقارنته في العمليتين. تأخذ إحدى القيم التالية: .TP \fBKCMP_FILE\fP التحقق مما إذا كان واصف الملف \fIidx1\fP في العملية \fIpid1\fP يشير إلى نفس وصف الملف المفتوح (انظر \fBopen\fP(2)) مثل واصف الملف \fIidx2\fP في العملية \fIpid2\fP. يمكن أن يحدث وجود واصفي ملف يشيران إلى نفس وصف الملف المفتوح نتيجة لـ \fBdup\fP(2) (وما شابه) \fBfork\fP(2)، أو تمرير واصفات الملفات عبر مقبس نطاق (انظر \fBunix\fP(7)). .TP \fBKCMP_FILES\fP التحقق مما إذا كانت العمليتان تشاركان نفس مجموعة واصفات الملفات المفتوحة. يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر مناقشة العلم \fBCLONE_FILES\fP في \fBclone\fP(2). .TP \fBKCMP_FS\fP التحقق مما إذا كانت العمليتان تشاركان نفس معلومات نظام الملفات (أي قناع إنشاء وضع الملف، دليل العمل، وجذر نظام الملفات). يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر مناقشة العلم \fBCLONE_FS\fP في \fBclone\fP(2). .TP \fBKCMP_IO\fP التحقق مما إذا كانت العمليتان تشاركان سياق الإدخال/الإخراج. يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر مناقشة العلم \fBCLONE_IO\fP في \fBclone\fP(2). .TP \fBKCMP_SIGHAND\fP التحقق مما إذا كانت العمليتان تشاركان نفس جدول ترتيبات الإشارات. يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر مناقشة العلم \fBCLONE_SIGHAND\fP في \fBclone\fP(2). .TP \fBKCMP_SYSVSEM\fP تحقق مما إذا كانت العمليات تشترك في نفس قائمة عمليات التراجع عن إشارات System\V. يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر شرح العلامة \fBCLONE_SYSVSEM\fP في \fBclone\fP(2). .TP \fBKCMP_VM\fP التحقق مما إذا كانت العمليتان تشاركان نفس مساحة العنوان. يتم تجاهل الوسيطتين \fIidx1\fP و \fIidx2\fP. انظر مناقشة العلم \fBCLONE_VM\fP في \fBclone\fP(2). .TP \fBKCMP_EPOLL_TFD\fP (منذ Linux 4.13) .\" commit 0791e3644e5ef21646fe565b9061788d05ec71d4 التحقق مما إذا كان واصف الملف \fIidx1\fP للعملية \fIpid1\fP موجودًا في مثيل \fBepoll\fP(7) الموصوف بواسطة \fIidx2\fP للعملية \fIpid2\fP. الوسيطة \fIidx2\fP هي مؤشر لبنية حيث يتم وصف الملف الهدف. هذه البنية لها الشكل: .P .in +4n .EX struct kcmp_epoll_slot { __u32 efd; __u32 tfd; __u64 toff; }; .EE .in .P داخل هذه البنية، \fIefd\fP هو واصف ملف epoll مُعاد من \fBepoll_create\fP(2)، \fItfd\fP هو رقم واصف ملف هدف، و \fItoff\fP هو إزاحة ملف هدف تُحسب من الصفر. يمكن تسجيل عدة أهداف مختلفة بنفس رقم واصف الملف، ويساعد تعيين إزاحة محددة في فحص كل منها. .P لاحظ أن \fBkcmp\fP() غير محمي ضد النتائج الإيجابية الخاطئة التي قد تحدث إذا كانت العمليات قيد التشغيل حاليًا. يجب إيقاف العمليات عن طريق إرسال \fBSIGSTOP\fP (انظر \fBsignal\fP(7)) قبل الفحص باستدعاء النظام هذا للحصول على نتائج ذات معنى. .SH "قيمة الإرجاع" قيمة الإرجاع لاستدعاء ناجح لـ \fBkcmp\fP() هي ببساطة نتيجة المقارنة الحسابية لمؤشرات النواة (عندما تقارن النواة الموارد، تستخدم عناوين ذاكرتها). .P أسهل طريقة للشرح هي النظر في مثال. افترض أن \fIv1\fP و \fIv2\fP هما عنوانا الموارد المناسبة، فإن قيمة الإرجاع تكون إحدى التالية: .RS .TP \fB0\fP \fIv1\fP يساوي \fIv2\fP؛ بمعنى آخر، تشارك العمليتان المورد. .TP \fB1\fP \fIv1\fP أصغر من \fIv2\fP. .TP \fB2\fP \fIv1\fP أكبر من \fIv2\fP. .TP \fB3\fP \fIv1\fP لا يساوي \fIv2\fP، لكن معلومات الترتيب غير متوفرة. .RE .P عند الخطأ، تُعاد القيمة \-1، ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .P صُمم \fBkcmp\fP() لإرجاع قيم مناسبة للفرز. هذا مفيد بشكل خاص إذا احتاج المرء لمقارنة عدد كبير من واصفات الملفات. .SH الأخطاء .TP \fBEBADF\fP \fItype\fP هو \fBKCMP_FILE\fP و \fIfd1\fP أو \fIfd2\fP ليس واصف ملف مفتوح. .TP \fBEFAULT\fP فتحة epoll المُشار إليها بواسطة \fIidx2\fP خارج نطاق عنوان المستخدم. .TP \fBEINVAL\fP \fItype\fP غير صالح. .TP \fBENOENT\fP الملف الهدف غير موجود في مثيل \fBepoll\fP(7). .TP \fBEPERM\fP صلاحية غير كافية لفحص موارد العملية. القدرة \fBCAP_SYS_PTRACE\fP مطلوبة لفحص العمليات التي لا تملكها. قد تنطبق قيود ptrace أخرى أيضًا، مثل \fBCONFIG_SECURITY_YAMA\fP، والتي عندما تكون \fI/proc/sys/kernel/yama/ptrace_scope\fP مساوية لـ 2، تحد \fBkcmp\fP() من العمليات الفرعية؛ انظر \fBptrace\fP(2). .TP \fBESRCH\fP العملية \fIpid1\fP أو \fIpid2\fP غير موجودة. .SH المعايير لينكس. .SH التاريخ لينكس 3.5. .P قبل لينكس 5.12، تكون استدعاء النظام هذا متاحة فقط إذا كان النواة مُهيأة بـ \fBCONFIG_CHECKPOINT_RESTORE\fP، لأن الغرض الأصلي من استدعاء النظام كان لميزة نقطة التفتيش/الاستعادة في مساحة المستخدم (CRIU). (البديل لاستدعاء النظام هذا كان سيكون كشف معلومات العملية المناسبة عبر نظام ملفات \fBproc\fP(5)؛ اعتُبر هذا غير مناسب لأسباب أمنية.) منذ لينكس 5.12، تكون استدعاء النظام هذه متاحة أيضًا إذا كانت النواة مُهيأة بـ \fBCONFIG_KCMP\fP. .SH ملاحظات انظر \fBclone\fP(2) للحصول على بعض المعلومات الأساسية حول الموارد المشتركة المُشار إليها في هذه الصفحة. .SH أمثلة يستخدم البرنامج أدناه \fBkcmp\fP() لاختبار ما إذا كانت أزواج واصفات الملفات تشير إلى نفس وصف الملف المفتوح. يختبر البرنامج حالات مختلفة لأزواج واصفات الملفات، كما هو موصوف في مخرجات البرنامج. مثال على تشغيل البرنامج هو كما يلي: .P .in +4n .EX $\fB ./a.out\fP; Parent PID is 1144 Parent opened file on FD 3 \& PID of child of fork() is 1145 Compare duplicate FDs from different processes: kcmp(1145, 1144, KCMP_FILE, 3, 3) ==> same Child opened file on FD 4 Compare FDs from distinct open()s in same process: kcmp(1145, 1145, KCMP_FILE, 3, 4) ==> different Child duplicated FD 3 to create FD 5 Compare duplicated FDs in same process: kcmp(1145, 1145, KCMP_FILE, 3, 5) ==> same .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (kcmp.c) \& .EX #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include \& static int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { return syscall(SYS_kcmp, pid1, pid2, type, idx1, idx2); } \& static void test_kcmp(char *msg, pid_t pid1, pid_t pid2, int fd_a, int fd_b) { printf("\[rs]t%s\[rs]n", msg); printf("\[rs]t\[rs]tkcmp(%jd, %jd, KCMP_FILE, %d, %d) ==> %s\[rs]n", (intmax_t) pid1, (intmax_t) pid2, fd_a, fd_b, (kcmp(pid1, pid2, KCMP_FILE, fd_a, fd_b) == 0) ? "same" : "different"); } \& int main(void) { int fd1, fd2, fd3; static const char pathname[] = "/tmp/kcmp.test"; \& fd1 = open(pathname, O_CREAT | O_RDWR, 0600); if (fd1 == \-1) err(EXIT_FAILURE, "open"); \& printf("Parent PID is %jd\[rs]n", (intmax_t) getpid()); printf("Parent opened file on FD %d\[rs]n\[rs]n", fd1); \& switch (fork()) { case \-1: err(EXIT_FAILURE, "fork"); \& case 0: printf("PID of child of fork() is %jd\[rs]n", (intmax_t) getpid()); \& test_kcmp("Compare duplicate FDs from different processes:", getpid(), getppid(), fd1, fd1); \& fd2 = open(pathname, O_CREAT | O_RDWR, 0600); if (fd2 == \-1) err(EXIT_FAILURE, "open"); printf("Child opened file on FD %d\[rs]n", fd2); \& test_kcmp("Compare FDs from distinct open()s in same process:", getpid(), getpid(), fd1, fd2); \& fd3 = dup(fd1); if (fd3 == \-1) err(EXIT_FAILURE, "dup"); printf("Child duplicated FD %d to create FD %d\[rs]n", fd1, fd3); \& test_kcmp("Compare duplicated FDs in same process:", getpid(), getpid(), fd1, fd3); break; \& default: wait(NULL); } \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBclone\fP(2), \fBunshare\fP(2) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .