Scroll to navigation

readlink(2) System Calls Manual readlink(2)

الاسم

readlink, readlinkat - قراءة قيمة رابط رمزي

المكتبة

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

موجز

#include <unistd.h>
ssize_t readlink(const char *restrict pathname, char *restrict buf,
                 size_t bufsiz);
#include <fcntl.h>            /* تعريف ثوابت AT_* */
#include <unistd.h>
ssize_t readlinkat(int dirfd, const char *restrict pathname,
                 char *restrict buf, size_t bufsiz);

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

readlink():


_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
|| /* glibc <= 2.19: */ _BSD_SOURCE

readlinkat():


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

الوصف

تضع readlink() محتويات الرابط الرمزي pathname في المخزن المؤقت buf، الذي حجمه bufsiz. لا تُلحق readlink() بايتة خالية ختامية بـ buf. ستقتطع (بصمت) المحتويات (إلى طول bufsiz حرفًا)، في حال كان المخزن المؤقت صغيرًا جدًا لاستيعاب كل المحتويات.

readlinkat()

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

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

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

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

منذ لينكس 2.6.39، يمكن أن يكون pathname سلسلة فارغة، وفي هذه الحالة يعمل الاستدعاء على الرابط الرمزي المُشار إليه بـ dirfd (والذي ينبغي الحصول عليه باستخدام open(2) مع العلمين O_PATH و O_NOFOLLOW).

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

قيمة الإرجاع

عند النجاح، تُرجع هذه الاستدعاءات عدد البايتات الموضوعة في buf. (إذا كانت القيمة المُرجعة تساوي bufsiz، فقد حدث اقتطاع.) عند الخطأ، يُرجع -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

تم رفض إذن البحث لمكون من بادئة المسار. (انظر أيضًا path_resolution(7).)
(readlinkat()) pathname نسبي لكن dirfd ليس AT_FDCWD ولا واصف ملف صالحًا.
يمتد buf خارج مساحة العنوان المخصصة للعملية.
bufsiz ليس موجبًا.
الملف المُسمى (أي مكون اسم الملف النهائي لـ pathname) ليس رابطًا رمزيًا.
حدث خطأ إدخال/إخراج أثناء القراءة من نظام الملفات.
صودفت روابط رمزية كثيرة جدًا عند ترجمة اسم المسار.
اسم مسار، أو مكون من اسم مسار، طويل جدًا.
الملف المسمى غير موجود.
ذاكرة النواة المتوفرة غير كافية.
أحد مكونات بادئة المسار ليس دليلاً.
(readlinkat()) pathname نسبي و dirfd هو واصف ملف يُشير إلى ملف غير دليل.

المعايير

POSIX.1-2008.

التاريخ

4.4BSD (ظهر لأول مرة في 4.2BSD)، POSIX.1-2001، POSIX.1-2008.
POSIX.1-2008. لينكس 2.6.16،‏ glibc 2.4.

حتى glibc 2.4 وما تضمنته، كان نوع الإرجاع لـ readlink() مُصرحًا به كـ int. حاليًا، يُصرح بنوع الإرجاع كـ ssize_t، كما هو مطلوب (حديثًا) في POSIX.1-2001.

glibc

على الأنوية القديمة حيث readlinkat() غير متوفرة، تتراجع دالة الغلاف glibc لاستخدام readlink(). عندما يكون pathname اسم مسار نسبي، تُنشئ glibc اسم مسار بناءً على الرابط الرمزي في /proc/self/fd الذي يُطابق وسيطة dirfd.

ملاحظات

قد لا يوفر استخدام مخزن مؤقت بحجم ثابت مساحة كافية لمحتويات الرابط الرمزي. يمكن الحصول على الحجم المطلوب للمخزن المؤقت من قيمة stat.st_size المُرجعة باستدعاء lstat(2) على الرابط. ومع ذلك، يجب التحقق من عدد البايتات التي كتبتها readlink() و readlinkat() للتأكد من أن حجم الرابط الرمزي لم يزد بين الاستدعاءات. يعالج التخصيص الديناميكي للمخزن المؤقت لـ readlink() و readlinkat() أيضًا مشكلة قابلية النقل الشائعة عند استخدام PATH_MAX لحجم المخزن المؤقت، حيث أن هذا الثابت غير مضمون التعريف وفقًا لـ POSIX إذا لم يكن لدى النظام مثل هذا الحد.

أمثلة

يخصص البرنامج التالي المخزن المؤقت المطلوب بواسطة readlink() ديناميكيًا من المعلومات المقدمة بواسطة lstat(2)، مع الرجوع إلى مخزن مؤقت بحجم PATH_MAX في الحالات التي يُبلغ فيها lstat(2) عن حجم صفري.

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{

char *buf;
ssize_t nbytes, bufsiz;
struct stat sb;
if (argc != 2) {
fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (lstat(argv[1], &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
/* Add one to the link size, so that we can determine whether
the buffer returned by readlink() was truncated. */
bufsiz = sb.st_size + 1;
/* Some magic symlinks under (for example) /proc and /sys
report 'st_size' as zero. In that case, take PATH_MAX as
a "good enough" estimate. */
if (sb.st_size == 0)
bufsiz = PATH_MAX;
buf = malloc(bufsiz);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
nbytes = readlink(argv[1], buf, bufsiz);
if (nbytes == -1) {
perror("readlink");
exit(EXIT_FAILURE);
}
/* Print only 'nbytes' of 'buf', as it doesn't contain a terminating
null byte ('\0'). */
printf("'%s' points to '%.*s'\n", argv[1], (int) nbytes, buf);
/* If the return value was equal to the buffer size, then
the link target was larger than expected (perhaps because the
target was changed between the call to lstat() and the call to
readlink()). Warn the user that the returned target may have
been truncated. */
if (nbytes == bufsiz)
printf("(Returned buffer may have been truncated)\n");
free(buf);
exit(EXIT_SUCCESS); }

انظر أيضًا

readlink(1), lstat(2), stat(2), symlink(2), realpath(3), path_resolution(7), symlink(7)

ترجمة

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

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

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

15 يونيو 2024 صفحات دليل لينكس 6.9.1