fsync(2)

الاسم
fsync, fdatasync - مزامنة حالة الملف الداخلية مع جهاز التخزين

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

موجز
#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

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

fsync():
    glibc 2.16 and later:
        No feature test macros need be defined
    glibc up to and including 2.15:
        _BSD_SOURCE || _XOPEN_SOURCE
            || /* Since glibc 2.8: */ _POSIX_C_SOURCE >= 200112L

fdatasync():
    _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

الوصف
fsync() ينقل ("يُفرغ") جميع البيانات الداخلية المعدلة (أي صفحات خبيئة المخزن المؤقت المعدلة) للملف المشار إليه بواصف الملف fd إلى جهاز القرص (أو جهاز تخزين دائم آخر) بحيث يمكن استرجاع جميع المعلومات المتغيرة حتى لو تعطل النظام أو أعيد تشغيله. يتضمن ذلك الكتابة عبر خبيئة القرص أو إفراغها إن وجدت. يحجب الاستدعاء حتى يبلغ الجهاز بأن النقل قد اكتمل.

بالإضافة إلى إفراغ بيانات الملف، يُفرغ fsync() أيضًا معلومات البيانات الوصفية المرتبطة بالملف (انظر inode(7)).

استدعاء fsync() لا يضمن بالضرورة وصول الإدخال في الدليل الذي يحتوي على الملف إلى القرص أيضًا. لذلك، يلزم استدعاء fsync() صريح على واصف ملف للدليل.

fdatasync() مشابه لـ fsync()، لكنه لا يُفرغ البيانات الوصفية المعدلة إلا إذا كانت تلك البيانات الوصفية ضرورية للسماح بمعالجة استرجاع بيانات لاحق بشكل صحيح. على سبيل المثال، التغييرات في st_atime أو st_mtime (على التوالي، وقت آخر وصول ووقت آخر تعديل؛ انظر inode(7)) لا تتطلب إفراغًا لأنها ليست ضرورية لمعالجة قراءة بيانات لاحقة بشكل صحيح. من ناحية أخرى، تغيير حجم الملف (st_size، كما يتم بواسطة ftruncate(2) مثلاً)، يتطلب إفراغ البيانات الوصفية.

الهدف من fdatasync() هو تقليل نشاط القرص للتطبيقات التي لا تتطلب مزامنة جميع البيانات الوصفية مع القرص.

قيمة الإرجاع
عند النجاح، تُرجع استدعاءات النظام هذه صفرًا. عند الخطأ، يُرجع -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EBADF
    fd ليس واصف ملف مفتوحًا صالحًا.

EINTR
    قُطعت الدالة بإشارة؛ انظر signal(7).

EIO حدث خطأ أثناء المزامنة. قد يتعلق هذا الخطأ ببيانات كُتبت إلى واصف ملف آخر على نفس الملف. منذ Linux 4.13، سيتم الإبلاغ عن الأخطاء الناتجة عن الكتابة الخلفية إلى جميع واصفات الملفات التي ربما كتبت البيانات التي تسببت في الخطأ. بعض أنظمة الملفات (مثل NFS) تتبع بدقة البيانات التي جاءت من خلال أي واصف ملف، وتعطي تقارير أكثر دقة. أنظمة الملفات الأخرى (مثل معظم أنظمة الملفات المحلية) ستُبلغ عن الأخطاء إلى جميع واصفات الملفات التي كانت مفتوحة على الملف عند تسجيل الخطأ.

ENOSPC
    نفدت مساحة القرص أثناء المزامنة.

EROFS
EINVAL
    fd مرتبط بملف خاص (مثل أنبوب، FIFO، أو مقبس) لا يدعم المزامنة.

ENOSPC
EDQUOT
    fd مرتبط بملف على NFS أو نظام ملفات آخر لا يخصص مساحة في وقت استدعاء النظام write(2)، وفشلت كتابة سابقة بسبب عدم كفاية مساحة التخزين.

الإصدارات
على أنظمة POSIX التي يتوفر فيها fdatasync()، يُعرف _POSIX_SYNCHRONIZED_IO في <unistd.h> بقيمة أكبر من 0. (انظر أيضًا sysconf(3).)

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

التاريخ

fsync()
    4.2BSD, SUSv1, POSIX.1-1996.

fdatasync()
    POSIX.1-1996.

في Linux 2.2 والإصدارات الأقدم، fdatasync() مكافئ لـ fsync()، وبالتالي ليس له ميزة أداء.

تطبيقات fsync() في النوى القديمة وأنظمة الملفات الأقل استخدامًا لا تعرف كيفية إفراغ خبائن القرص. في هذه الحالات، يجب تعطيل خبائن القرص باستخدام hdparm(8) أو sdparm(8) لضمان التشغيل الآمن.

تحت AT&T UNIX System V Release 4، يجب فتح fd للكتابة. هذا في حد ذاته غير متوافق مع واجهة BSD الأصلية ومحظور بواسطة POSIX، لكنه مع ذلك لا يزال موجودًا في HP-UX و AIX.

انظر أيضًا
sync(1), bdflush(2), open(2), posix_fadvise(2), pwritev(2), sync(2), sync_file_range(2), fflush(3), fileno(3), hdparm(8), mount(8)

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

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

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