| FSYNC(2) | فراخوانهای سیستمی لینوکس | FSYNC(2) |
نام (NAME)
fsync, fdatasync - همگامسازی وضعیت درونحافظهای یک فایل با دستگاه ذخیرهسازی
کتابخانه (LIBRARY)
کتابخانه استاندارد سی (libc, -lc)
خلاصه دستور (SYNOPSIS)
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
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
توضیحات (DESCRIPTION)
فراخوان fsync() تمام دادههای اصلاحشدهٔ درون حافظه (یعنی صفحههای تغییریافته در بافر کش) برای فایل ارجاعشده توسط توصیفگر فایل fd را به دستگاه دیسک (یا هر دستگاه ذخیرهسازی دائمی دیگر) انتقال میدهد (flush میکند) تا تمام اطلاعات تغییریافته حتی در صورت خرابی یا راهاندازی مجدد سیستم قابل بازیابی باشند. این عملیات شامل نوشتن از طریق یا خالیکردن کش دیسک در صورت وجود نیز میشود. این فراخوان تا زمانی که دستگاه گزارش اتمام انتقال را ندهد مسدود میماند.
علاوه بر خالیکردن دادههای فایل، فراخوان fsync() اطلاعات متاداده مرتبط با فایل را نیز همگامسازی میکند (ببینید inode(7)).
فراخوانی fsync() لزوماً تضمین نمیکند که مدخل مربوط به فایل در دایرکتوری دربرگیرندهٔ آن نیز به دیسک رسیده باشد. برای این منظور، فراخوانی صریح fsync() روی توصیفگر فایل دایرکتوری مربوطه نیز مورد نیاز است.
فراخوان fdatasync() مشابه fsync() است، اما متادادههای اصلاحشده را تخلیه نمیکند مگر اینکه آن متاداده برای بازیابی درست دادهها در مراجعات بعدی ضروری باشد. به عنوان مثال، تغییرات در st_atime یا st_mtime (به ترتیب زمان آخرین دسترسی و زمان آخرین اصلاح؛ ببینید inode(7)) نیازی به تخلیه و ذخیرهسازی ندارند زیرا برای خواندن صحیح دادهها در آینده لازم نیستند. از طرف دیگر، تغییر در اندازهٔ فایل (st_size، مانند تغییری که توسط ftruncate(2) ایجاد میشود)، نیازمند همگامسازی متاداده با دیسک خواهد بود.
هدف فراخوان fdatasync() کاهش فعالیتهای دیسک برای برنامههایی است که نیازی به همگامسازی تمام متادادهها با دیسک ندارند.
مقدار بازگشتی (RETURN VALUE)
در صورت موفقیت، این فراخوانهای سیستمی مقدار صفر را برمیگردانند. در صورت بروز خطا، مقدار -1 برگردانده شده و errno برای نشان دادن خطای رخداده مقداردهی میشود.
خطاها (ERRORS)
- EBADF
- مقدار fd یک توصیفگر فایل باز و معتبر نیست.
- EINTR
- اجرای تابع توسط یک سیگنال متوقف شده است؛ ببینید signal(7).
- EIO
- خطایی هنگام همگامسازی رخ داده است. این خطا ممکن است مربوط به دادههای نوشتهشده از طریق توصیفگر فایل دیگری روی همین فایل باشد. از نسخه لینوکس 4.13 به بعد، خطاهای بازنویسی (write-back) به تمام توصیفگرهای فایلی که احتمالاً دادههای عامل خطا را نوشتهاند گزارش میشود. برخی سیستمهای فایل (مانند NFS) پیگیری دقیقی انجام میدهند که کدام داده از طریق کدام توصیفگر فایل آمده است و گزارش دقیقتری ارائه میدهند. سایر سیستمهای فایل (مانند بیشتر سیستمهای فایل محلی) خطا را به تمام توصیفگرهای فایلی که هنگام ثبت خطا روی فایل باز بودهاند گزارش خواهند کرد.
- ENOSPC
- فضای دیسک هنگام همگامسازی تمام شده است.
- EROFS, EINVAL
- مقدار fd به یک فایل ویژه (مانند pipe، FIFO یا سوکت) متصل است که از همگامسازی پشتیبانی نمیکند.
- ENOSPC, EDQUOT
- مقدار fd به فایلی روی NFS یا سیستم فایل دیگری متصل است که در زمان فراخوان سیستمی write(2) فضا تخصیص نمیدهد، و برخی عملیاتهای نوشتن پیشین به دلیل کمبود فضای ذخیرهسازی ناموفق بودهاند.
استانداردها (STANDARDS)
POSIX.1-2001, POSIX.1-2008, 4.3BSD.
در سیستمهای سازگار با POSIX که fdatasync() در آنها در دسترس است، مقدار _POSIX_SYNCHRONIZED_IO در <unistd.h> به عددی بزرگتر از صفر تعریف شده است. (همچنین ببینید sysconf(3).)
نکات (NOTES)
در برخی سیستمهای UNIX (ولی نه لینوکس)، fd باید یک توصیفگر فایل با قابلیت نوشتن (writable) باشد.
در لینوکس 2.2 و نسخههای قدیمیتر، fdatasync() معادل fsync() است و بنابراین هیچ برتری عملکردی نسبت به آن ندارد.
پیادهسازیهای fsync() در هستههای قدیمیتر و سیستمهای فایل کمتر استفادهشده، روش خالیکردن کش دیسک را نمیدانند. در این موارد باید کش دیسک با استفاده از hdparm(8) یا sdparm(8) غیرفعال شود تا عملکرد ایمن تضمین گردد.
همچنین ببینید (SEE ALSO)
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)
| 2023-02-05 | Linux man-pages 6.03 |