unlink(2)

الاسم
unlink, unlinkat - حذف اسم وربما الملف الذي يشير إليه

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

موجز
#include <unistd.h>

int unlink(const char *path);

#include <fcntl.h>           /* تعريف ثوابت AT_* */
#include <unistd.h>

int unlinkat(int dirfd, const char *path, int flags);

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

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

الوصف
unlink() يحذف اسمًا من نظام الملفات. إذا كان هذا الاسم هو آخر رابط لملف ولا توجد أي عمليات تفتح الملف، يُحذف الملف وتُتاح المساحة التي كان يستخدمها لإعادة الاستخدام.

إذا كان الاسم هو آخر رابط لملف ولكن لا تزال بعض العمليات تفتح الملف، سيبقى الملف موجودًا حتى يُغلق آخر واصف ملف يشير إليه.

إذا كان الاسم يشير إلى رابط رمزي، فسَيُزَالُ الرابط.

إذا كان الاسم يشير إلى مقبس أو FIFO أو جهاز، يُزال اسمه ولكن العمليات التي تفتح الكائن قد تستمر في استخدامه.

  unlinkat()
يعمل استدعاء النظام unlinkat() بنفس الطريقة تمامًا مثل unlink() أو rmdir(2) (اعتمادًا على ما إذا كانت flags تتضمن العلم AT_REMOVEDIR أم لا) باستثناء الاختلافات الموصوفة هنا.

إذا كان path نسبيًا، يُفسر بالنسبة إلى الدليل الذي يشير إليه واصف الملف dirfd (بدلاً من دليل العمل الحالي للعملية المستدعية، كما تفعل unlink() و rmdir(2) لمسار نسبي).

إذا كان path نسبيًا و dirfd هو القيمة الخاصة AT_FDCWD، يُفسر path بالنسبة إلى دليل العمل الحالي للعملية المستدعية (مثل unlink() و rmdir(2)).

إذا كان المسار path مطلقاً، فُيتجاهل dirfd.

flags هو قناع بت يمكن تحديده إما كـ 0، أو عن طريق ORing لقيم الأعلام التي تتحكم في عملية unlinkat(). حاليًا، يُعرف علم واحد فقط:

AT_REMOVEDIR
    افتراضيًا، ينفذ unlinkat() ما يعادل unlink() على path. إذا تم تحديد العلم AT_REMOVEDIR، ينفذ ما يعادل rmdir(2) على path.

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

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

الأخطاء

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

EBUSY
    لا يمكن حذف path لأنه قيد الاستخدام من قبل النظام أو عملية أخرى؛ على سبيل المثال، هو نقطة وصل أو أن برنامج عميل NFS أنشأه لتمثيل inode نشط ولكن بدون اسم ("NFS silly renamed").

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

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

EISDIR
    path يشير إلى دليل. (هذه هي القيمة غير POSIX التي تُرجع منذ Linux 2.1.132.)

ELOOP
    تمت مواجهة عدد كبير جدًا من الروابط الرمزية في ترجمة path.

ENAMETOOLONG
    المسار path كان طويلاً جداً.

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

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

ENOTDIR
    المكون المستخدم كدليل في path ليس دليلاً في الواقع.

EPERM
    النظام لا يسمح بحذف الدلائل، أو حذف الدلائل يتطلب صلاحيات لا تملكها العملية المستدعية. (هذا هو خطأ العودة الموصوف من POSIX؛ كما ذكر أعلاه، يعيد Linux EISDIR لهذه الحالة.)

EPERM (Linux فقط)
    نظام الملفات لا يسمح بحذف الملفات.

EPERM أو EACCES
    الدليل الذي يحتوي على path لديه البت اللاصق (S_ISVTX) مضبوطًا و UID الفعال للعملية ليس UID الملف المراد حذفه ولا UID الدليل الذي يحتويه، والعملية ليست مميزة (Linux: لا تملك القدرة CAP_FOWNER).

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

EROFS
    يشير path إلى ملف في نظام ملفات للقراءة فقط.

نفس الأخطاء التي تحدث لـ unlink() و rmdir(2) يمكن أن تحدث أيضًا لـ unlinkat(). يمكن أن تحدث الأخطاء الإضافية التالية لـ unlinkat():

EBADF
    المسار path نسبي ولكن dirfd ليس AT_FDCWD ولا واصف ملف صالح.

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

EISDIR
    path يشير إلى دليل، ولم يتم تحديد AT_REMOVEDIR في flags.

ENOTDIR
    المسار path نسبي و dirfd هو واصف ملف يشير إلى ملف غير الدليل.

المعايير
POSIX.1-2024.

التاريخ

unlink()
    SVr4، 4.3BSD، POSIX.1-2001.

unlinkat()
    POSIX.1-2008. لينكس 2.6.16،‏ glibc 2.4.

  glibc
على النوى القديمة حيث unlinkat() غير متاح، تعود دالة الغلاف glibc إلى استخدام unlink() أو rmdir(2). عندما يكون path نسبيًا، تبني glibc اسم مسار بناءً على الرابط الرمزي في /proc/self/fd الذي يتوافق مع وسيطة dirfd.

العلل
يمكن أن تتسبب عيوب في البروتوكول الذي يعتمد عليه NFS في اختفاء غير متوقع للملفات التي لا تزال قيد الاستخدام.

انظر أيضًا
rm(1)، unlink(1)، chmod(2)، link(2)، mknod(2)، open(2)، rename(2)، rmdir(2)، mkfifo(3)، remove(3)، path_resolution(7)، symlink(7)

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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