Scroll to navigation

link(2) System Calls Manual link(2)

الاسم

link, linkat - إنشاء اسم جديد لملف

المكتبة

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

موجز

#include <unistd.h>
int link(const char *oldpath, const char *newpath);
#include <fcntl.h>           /* تعريف ثوابت AT_* */
#include <unistd.h>
int linkat(int olddirfd, const char *oldpath,
           int newdirfd, const char *newpath, int flags);

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

linkat():


منذ glibc 2.10:
_POSIX_C_SOURCE >= 200809L
قبل glibc 2.10:
_ATFILE_SOURCE

الوصف

link() ينشئ رابطًا جديدًا (يُعرف أيضًا بالرابط الصلب) لملف موجود.

إذا كان newpath موجودًا، فلن يتم استبداله.

يمكن استخدام هذا الاسم الجديد تمامًا مثل القديم لأي عملية؛ يشير كلا الاسمين إلى نفس الملف (وبالتالي لهما نفس الأذونات والملكية) ومن المستحيل تحديد أي اسم كان "الأصلي".

linkat()

تعمل استدعاء النظام linkat() بنفس طريقة link()، باستثناء الاختلافات الموصوفة هنا.

إذا كان اسم المسار المعطى في oldpath نسبيًا، فسيتم تفسيره بالنسبة للدليل المشار إليه بواسطة واصف الملف olddirfd (بدلاً من نسبته إلى دليل العمل الحالي للعملية المستدعية، كما يفعل link() لاسم مسار نسبي).

إذا كان oldpath نسبيًا وكان olddirfd هو القيمة الخاصة AT_FDCWD، فسيتم تفسير oldpath بالنسبة إلى دليل العمل الحالي للعملية المستدعية (مثل link()).

إذا كان oldpath مطلقا، يُتجاهل olddirfd.

تفسير newpath هو نفسه بالنسبة لـ oldpath، باستثناء أن مسار الملف النسبي يُفسر بالنسبة للدليل الذي يشير إليه واصف الملف newdirfd.

يمكن دمج القيم التالية باستخدام OR على مستوى البت في flags:

إذا كان oldpath سلسلة فارغة، فأنشئ رابطًا للملف المشار إليه بواسطة olddirfd (والذي قد تم الحصول عليه باستخدام علامة open(2) O_PATH). في هذه الحالة، يمكن أن يشير olddirfd إلى أي نوع من الملفات باستثناء الدليل. لن يعمل هذا عمومًا إذا كان عدد روابط الملف صفرًا (الملفات المنشأة بـ O_TMPFILE وبدون O_EXCL هي استثناء). يجب أن يمتلك المستدعي صلاحية CAP_DAC_READ_SEARCH لاستخدام هذه العلامة. هذه العلامة خاصة بنظام Linux؛ عرّف _GNU_SOURCE للحصول على تعريفها.
افتراضيًا، لا يقوم linkat() بإلغاء مرجعية oldpath إذا كان رابطًا رمزيًا (مثل link()). يمكن تحديد العلامة AT_SYMLINK_FOLLOW في flags لجعل oldpath يُلغى مرجعيته إذا كان رابطًا رمزيًا. إذا كان procfs موصولًا، يمكن استخدام هذا كبديل لـ AT_EMPTY_PATH، كما يلي:

linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,

newname, AT_SYMLINK_FOLLOW);

قبل Linux 2.6.18، كانت وسيطة flags غير مستخدمة، وكان يجب تحديدها كـ 0.

انظر openat(2) لشرح الحاجة إلى linkat().

قيمة الإرجاع

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

الأخطاء

تم رفض صلاحية الكتابة إلى الدليل الذي يحتوي على newpath، أو تم رفض صلاحية البحث لأحد الدلائل في بادئة مسار oldpath أو newpath. (انظر أيضًا path_resolution(7).)
استُنفدت حصة المستخدم من كتل القرص على نظام الملفات.
newpath موجود بالفعل.
يشير oldpath أو newpath إلى خارج مساحة العناوين التي يمكن الوصول إليها.
حدث خطأ إدخال/إخراج.
وُجهت روابط رمزية كثيرة جدًا عند حل oldpath أو newpath.
الملف المشار إليه بواسطة oldpath لديه بالفعل الحد الأقصى لعدد الروابط إليه. على سبيل المثال، على نظام ملفات ext4(5) الذي لا يستخدم ميزة dir_index، فإن الحد الأقصى لعدد الروابط الصلبة لملف هو 65,000؛ على btrfs(5)، الحد هو 65,535 رابطًا.
كان oldpath أو newpath طويلًا جدًا.
مكون دليل في oldpath أو newpath غير موجود أو هو رابط رمزي معلق.
ذاكرة النواة المتوفرة غير كافية.
الجهاز الذي يحتوي على الملف ليس به مساحة لمدخل الدليل الجديد.
مكون يُستخدم كدليل في oldpath أو newpath ليس في الواقع دليلاً.
oldpath هو دليل.
نظام الملفات الذي يحتوي على oldpath و newpath لا يدعم إنشاء روابط صلبة.
لا يمتلك المستدعي صلاحية إنشاء رابط صلب لهذا الملف (انظر وصف /proc/sys/fs/protected_hardlinks في proc_sys_fs(5)).
oldpath مُعلّم كغير قابل للتغيير أو للإلحاق فقط. (انظر FS_IOC_SETFLAGS(2const).)
الملف موجود في نظام ملفات للقراءة فقط.
oldpath و newpath ليسا على نفس نظام الملفات الموصول. (يسمح Linux بوصول نظام ملفات في نقاط متعددة، لكن link() لا يعمل عبر عمليات وصل مختلفة، حتى إذا كان نفس نظام الملفات موصولًا على كليهما.)

يمكن أن تحدث الأخطاء الإضافية التالية لـ linkat():

oldpath (newpath) نسبي لكن olddirfd (newdirfd) ليس AT_FDCWD ولا واصف ملف صالح.
عُيّنت قيمة علم (flag) غير صالحة في flags.
حُدد AT_EMPTY_PATH في flags، لكن المتصل لم يملك القدرة CAP_DAC_READ_SEARCH.
جرت محاولة لربط ملف /proc/self/fd/NN الموافق لواصف ملف أُنشئ بـ

open(path, O_TMPFILE | O_EXCL, mode);
    

انظر open(2).
جرت محاولة لربط ملف /proc/self/fd/NN الموافق لملف حُذف.
oldpath اسم مسار نسبي و olddirfd يشير إلى دليل حُذف، أو newpath اسم مسار نسبي و newdirfd يشير إلى دليل حُذف.
oldpath نسبي و olddirfd واصف ملف يشير إلى ملف غير الدليل؛ أو ما شابه ذلك لـ newpath و newdirfd
حُدد AT_EMPTY_PATH في flags، oldpath سلسلة فارغة، و olddirfd يشير إلى دليل.

الإصدارات

ينص POSIX.1-2001 على أن link() يجب أن يفك إشارة oldpath إذا كان رابطًا رمزيًا. لكن منذ Linux 2.0، لا يفعل Linux ذلك: إذا كان oldpath رابطًا رمزيًا، فإن newpath يُنشأ كرابط (صُلب) لنفس ملف الرابط الرمزي (أي يصبح newpath رابطًا رمزيًا لنفس الملف الذي يشير إليه oldpath). تتصرف بعض التطبيقات الأخرى بنفس طريقة Linux. يغير POSIX.1-2008 مواصفات link()، مما يجعل فك إشارة oldpath إذا كان رابطًا رمزيًا أمرًا يعتمد على التطبيق. للتحكم الدقيق في معالجة الروابط الرمزية عند إنشاء رابط، استخدم linkat().

glibc

على النوى الأقدم حيث linkat() غير متوفر، تعود دالة الغلاف glibc إلى استخدام link()، ما لم يُحدد AT_SYMLINK_FOLLOW. عندما يكون oldpath و newpath اسمي مسار نسبيين، تبني glibc أسماء مسار بناءً على الروابط الرمزية في /proc/self/fd الموافقة للوسيطين olddirfd و newdirfd.

المعايير

POSIX.1-2024.

التاريخ

4.3BSD, SVr4, POSIX.1-1988 (لكن انظر VERSIONS).
POSIX.1-2008, glibc 2.4, Linux 2.6.16.

ملاحظات

الروابط الصلبة، كما تُنشأ بواسطة link()، لا يمكنها عبور أنظمة الملفات. استخدم symlink(2) إذا كان ذلك مطلوبًا.

العلل

على أنظمة ملفات NFS، قد يكون رمز الإرجاع خاطئًا في حال نفذ خادم NFS إنشاء الرابط ومات قبل أن يتمكن من الإبلاغ بذلك. استخدم stat(2) لمعرفة ما إذا أُنشئ الرابط.

انظر أيضًا

ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

11 فبراير 2026 صفحات دليل لينكس 6.18