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:

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

AT_SYMLINK_FOLLOW (منذ Linux 2.6.18)
    افتراضيًا، لا يقوم 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 للإشارة إلى الخطأ.

الأخطاء

EACCES
    تم رفض صلاحية الكتابة إلى الدليل الذي يحتوي على newpath، أو تم رفض صلاحية البحث لأحد الدلائل في بادئة مسار oldpath أو newpath. (انظر أيضًا path_resolution(7).)

EDQUOT
    استُنفدت حصة المستخدم من كتل القرص على نظام الملفات.

EEXIST
    newpath موجود بالفعل.

EFAULT
    يشير oldpath أو newpath إلى خارج مساحة العناوين التي يمكن الوصول إليها.

EIO حدث خطأ إدخال/إخراج.

ELOOP
    وُجهت روابط رمزية كثيرة جدًا عند حل oldpath أو newpath.

EMLINK
    الملف المشار إليه بواسطة oldpath لديه بالفعل الحد الأقصى لعدد الروابط إليه. على سبيل المثال، على نظام ملفات ext4(5) الذي لا يستخدم ميزة dir_index، فإن الحد الأقصى لعدد الروابط الصلبة لملف هو 65,000؛ على btrfs(5)، الحد هو 65,535 رابطًا.

ENAMETOOLONG
    كان oldpath أو newpath طويلًا جدًا.

ENOENT
    مكون دليل في oldpath أو newpath غير موجود أو هو رابط رمزي معلق.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

ENOSPC
    الجهاز الذي يحتوي على الملف ليس به مساحة لمدخل الدليل الجديد.

ENOTDIR
    مكون يُستخدم كدليل في oldpath أو newpath ليس في الواقع دليلاً.

EPERM
    oldpath هو دليل.

EPERM
    نظام الملفات الذي يحتوي على oldpath و newpath لا يدعم إنشاء روابط صلبة.

EPERM (منذ Linux 3.6)
    لا يمتلك المستدعي صلاحية إنشاء رابط صلب لهذا الملف (انظر وصف /proc/sys/fs/protected_hardlinks في proc_sys_fs(5)).

EPERM
    oldpath مُعلّم كغير قابل للتغيير أو للإلحاق فقط. (انظر FS_IOC_SETFLAGS(2const).)

EROFS
    الملف موجود في نظام ملفات للقراءة فقط.

EXDEV
    oldpath و newpath ليسا على نفس نظام الملفات الموصول. (يسمح Linux بوصول نظام ملفات في نقاط متعددة، لكن link() لا يعمل عبر عمليات وصل مختلفة، حتى إذا كان نفس نظام الملفات موصولًا على كليهما.)

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

EBADF
    oldpath (newpath) نسبي لكن olddirfd (newdirfd) ليس AT_FDCWD ولا واصف ملف صالح.

EINVAL
    عُيّنت قيمة علم (flag) غير صالحة في flags.

ENOENT
    حُدد AT_EMPTY_PATH في flags، لكن المتصل لم يملك القدرة CAP_DAC_READ_SEARCH.

ENOENT
    جرت محاولة لربط ملف /proc/self/fd/NN الموافق لواصف ملف أُنشئ بـ

        open(path, O_TMPFILE | O_EXCL, mode);

    انظر open(2).

ENOENT
    جرت محاولة لربط ملف /proc/self/fd/NN الموافق لملف حُذف.

ENOENT
    oldpath اسم مسار نسبي و olddirfd يشير إلى دليل حُذف، أو newpath اسم مسار نسبي و newdirfd يشير إلى دليل حُذف.

ENOTDIR
    oldpath نسبي و olddirfd واصف ملف يشير إلى ملف غير الدليل؛ أو ما شابه ذلك لـ newpath و newdirfd

EPERM
    حُدد 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.

التاريخ

link()
    4.3BSD, SVr4, POSIX.1-1988 (لكن انظر VERSIONS).

linkat()
    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 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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