Linux Command Open را بیاموزید

خلاصه داستان

#include << HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << HREF = "file: /usr/include/fcntl.h"> fcntl.h> int open (const char * pathname ، flags int int open (const char * pathname ، flags int ، mode_t mode int creat (const char * pathname ، mode_t mode

شرح

دستور open () system call linux برای تبدیل یک نام راه به یک توصیفگر فایل (یک عدد صحیح کوچک و غیر منفی برای استفاده در I / O بعدی به عنوان خواندن ، نوشتن و غیره) استفاده می شود. هنگامی که فراخوانی موفقیت آمیز باشد، توصیفگر فایل نشان داده می شود که حداقل ضرایب فایل است که در حال حاضر برای روند باز نمی شود. این تماس یک فایل باز باز می کند که با هیچ روند دیگر به اشتراک گذاشته نمی شود. (اما فایل های باز شده مشترک ممکن است از طریق تماس سیستم با چنگال (2) بوجود آیند.) توصیفگر فایل جدید تنظیم شده است که در سراسر توابع exec باز شود (see fcntl (2)). فشرده سازی فایل به آغاز فایل تنظیم شده است.

پرچم پارامتر یکی از O_RDONLY ، O_WRONLY یا O_RDWR است که درخواست باز کردن فایل به عنوان خوانده شده، فقط نوشتن یا خواندن / نوشتن، به ترتیب بیتی و یا "با صفر یا بیشتر از موارد زیر است:

O_CREAT

اگر فایل وجود ندارد، آن ایجاد خواهد شد. صاحب (شناسه کاربر) فایل به شناسه موثر کاربر فرایند تنظیم شده است. مالکیت گروه (شناسه گروه) یا به شناسه گروه مؤثر فرآیند یا به شناسه گروهی پوشه اصلی (بسته به نوع سیستم فایل و گزینه کوه و حالت پوشه اصلی، به عنوان مثال، mount گزینه های bsdgroups و sysvgroups سیستم فایل ext2، همانطور که در کوه (8) توضیح داده شده است.

O_EXCL

هنگامی که با O_CREAT مورد استفاده قرار می گیرد، اگر فایل در حال حاضر وجود داشته باشد، خطایی است و باز خواهد شکست. در این زمینه، یک لینک نمادین وجود دارد، صرف نظر از جایی که نقاط آن است. O_EXCL در سیستم های فایل NFS شکسته می شود ، برنامه هایی که بر روی آن تکیه می کنند برای انجام وظایف قفل حاوی شرایط مسابقه است. راه حل برای قفل کردن فایل اتمی با استفاده از یک فایل lockfile این است که یک فایل منحصربفرد در همان fs ایجاد کنید (مثلا شامل نام میزبان و pid)، از لینک (2) برای ایجاد یک لینک به فایل lock استفاده کنید. اگر لینک () 0 را باز کند، قفل موفق است. در غیر اینصورت، از فایل stat (2) در فایل منحصر به فرد استفاده کنید تا بررسی کنید آیا تعداد پیوند آن به 2 افزایش یافته است و در این صورت قفل نیز موفق است.

O_NOCTTY

اگر نام پورت اشاره به یک دستگاه ترمینال --- tty (4) - --- آن را تبدیل به ترمینال کنترل روند، حتی اگر روند آن را ندارد.

O_TRUNC

اگر فایل در حال حاضر وجود داشته باشد و یک فایل منظم است و حالت باز اجازه می دهد نوشتن (یعنی O_RDWR یا O_WRONLY) آن را به طول 0. اگر فایل یک فایل FIFO یا دستگاه ترمینال است، پرچم O_TRUNC نادیده گرفته می شود. در غیر این صورت، اثر O_TRUNC نامشخص است. (در بسیاری از نسخه های لینوکس آن را نادیده گرفته خواهد شد؛ در نسخه های دیگر، یک خطا را بازگرداند.)

O_APPEND

فایل در حالت آپدیت باز می شود. قبل از هر نوشتن ، اشارهگر فایل در انتهای فایل قرار دارد، همانطور که با lseek . O_APPEND ممکن است به فایل های خراب شده در سیستم فایل NFS منجر شود، اگر بیش از یک فرایند یک بار داده ها را به یک فایل اضافه می کند. این به این دلیل است که NFS از اضافه کردن یک پرونده پشتیبانی نمی کند، بنابراین هسته سرویس گیرنده باید آن را شبیه سازی کند، که بدون شرایط مسابقه قابل اجرا نیست.

O_NONBLOCK یا O_NDELAY

در صورت امکان، فایل در حالت غیر بلوک باز می شود. نه باز و نه هیچ عملیات بعدی در توصیفگر فایل که بازگردانده می شود، فرایند فراخوانی صبر می کند. برای مدیریت FIFOs (نام لوله)، همچنین FIFO (4) را ببینید. این حالت هیچ تاثیری بر روی فایل های غیر از FIFOs ندارد.

O_SYNC

پرونده برای I / O همگام باز است. هر نوشتن در توصیفگر فایل نتیجه حاصل فرایند فراخوانی را مسدود می کند تا زمانی که داده ها به صورت سخت افزاری فیزیکی نوشته شوند. هر چند محدودیتهایی را مشاهده کنید.

O_NOFOLLOW

اگر pathname یک لینک نمادین باشد، باز باز می شود. این افزونه FreeBSD است که در نسخه 2.1.126 به لینوکس اضافه شد. لینک های نمادین در مولفه های قبلی از نام راه پس از آن نیز دنبال می شود. سرصفحه های glibc 2.0.100 و بعدا شامل تعریفی از این پرچم هستند؛ هسته قبل از 2.1.126، اگر استفاده شود، آن را نادیده می گیرد .

O_DIRECTORY

اگر pathname یک دایرکتوری نیست، باز به شکست افتد. این پرچم ویژه لینوکس است و در نسخه کرنل 2.1.126 اضافه شده است، برای جلوگیری از مشکالت سرویس مجدد اگر opendir (3) بر روی FIFO یا نوار دستگاه نامیده شود، اما نباید در خارج از اجرای opendir استفاده شود .

O_DIRECT

سعی کنید به حداقل رساندن اثرات کش از I / O به و از این فایل. به طور کلی این عملکرد را کاهش خواهد داد، اما در موقعیت های خاص مانند زمانیکه برنامه های خود را ذخیره می کنند مفید است. فایل I / O به طور مستقیم به / از بافر های فضای کاربر انجام می شود. I / O همگام است، یعنی در تکمیل فراخوان (2) یا نوشتن (2) تماس سیستم، داده ها تضمین شده اند که منتقل شده اند. اندازه انتقال و هم تراز کردن بافر کاربر و جابجایی فایل باید کلیه مقادیر منطقی بلوک فایل سیستم باشد.
این پرچم در تعدادی از سیستم های یونیکس پشتیبانی می شود؛ پشتیبانی تحت لینوکس در نسخه کرنل 2.4.10 اضافه شد.
رابط کاربری معنا دار مشابه برای دستگاه های بلوک در خام (8) توصیف شده است.

O_ASYNC

یک سیگنال را تولید کنید (SIGIO به طور پیش فرض، اما این را می توان از طریق fcntl (2) تغییر داد) زمانی که ورودی یا خروجی بر روی این توصیفگر فایل امکان پذیر باشد. این ویژگی فقط برای پایانه ها، پشته ها و سوکت ها قابل استفاده است. برای اطلاعات بیشتر به fcntl (2) مراجعه کنید.

O_LARGEFILE

در سیستم های 32 بیتی که از سیستم فایل های بزرگ پشتیبانی می کنند، فایل هایی که اندازه آنها در 31 بیت نمایش داده نمی شود قادر به باز کردن هستند.

برخی از این پرچم های اختیاری را می توان با استفاده از fcntl پس از باز شدن فایل تغییر داد.

حالت استدلال مجوزهایی را برای استفاده در صورت ایجاد یک فایل جدید مشخص می کند. این روش توسط umask پردازش به طور معمول اصلاح شده است: مجوز فایل ایجاد شده (حالت & umask) است . توجه داشته باشید که این حالت فقط برای دسترسیهای آینده فایل جدید ایجاد شده است فراخوان باز که یک فایل فقط خواندنی ایجاد می کند ممکن است یک توصیفگر فایل خواندن / نوشتن را بازگرداند.

ثابت های نمادین زیر برای حالت ارائه می شوند:

S_IRWXU

00700 کاربر (صاحب فایل) خواندن، نوشتن و اجرای مجوز

S_IRUSR (S_IREAD)

00400 کاربر دارای اجازه خواندن است

S_IWUSR (S_IWRITE)

00200 کاربر مجوز نوشتن دارد

S_IXUSR (S_IEXEC)

کاربر 00100 دارای مجوز اجرای است

S_IRWXG

گروه 00070 خواندن، نوشتن و اجرای مجوز داشته است

S_IRGRP

گروه 00040 دارای اجازه خواندن است

S_IWGRP

گروه 00020 دارای اجازه نوشتن است

S_IXGRP

00010 گروه دارای مجوز اجرای است

S_IRWXO

00007 دیگران خواندن، نوشتن و اجرای مجوز دارند

S_IROTH

00004 دیگران مجوز را خوانده اند

S_IWOTH

00002 دیگران مجوز نوشتن دارند

S_IXOTH

00001 دیگران اجازه دسترسی دارند

حالت O_CREAT در پرچم ها باید مشخص شود و در غیر این صورت نادیده گرفته می شود.

creat معادل باز کردن با پرچم ها برابر O_CREAT | O_WRONLY | O_TRUNC .

مقدار بازگشتی

open و creat بازخوانی توصیفگر فایل جدید، و یا -1 اگر یک خطا رخ داده است (در این صورت، errno به درستی تنظیم شده است). توجه داشته باشید که باز می تواند فایل های خاص دستگاه را باز کند، اما Creat نمی تواند آنها را ایجاد کند - به جای استفاده از mknod (2).

در سیستم فایل NFS با نقشه برداری UID فعال می شود، باز می تواند یک توصیفگر فایل را بازگرداند، اما به عنوان مثال خواندن (2) درخواست ها با EACCES رد می شود . این به این دلیل است که مشتری با بازبینی مجوز ها باز می شود ، اما نقشه برداری UID توسط سرور بر روی خواندن و نوشتن درخواست انجام می شود.

اگر فایل به تازگی ایجاد شده باشد، فیلد های زمانی آن، ctime و mtime به زمان فعلی تنظیم می شود، و همچنین زمینه های ctime و mtime در دایرکتوری اصلی است. در غیر این صورت، اگر فایل به دلیل پرچم O_TRUNC اصلاح شود، فیلد های ctime و mtime آن به زمان فعلی تنظیم می شود.

خطاها

EEXIST

pathname در حال حاضر وجود دارد و O_CREAT و O_EXCL مورد استفاده قرار گرفتند.

EISDIR

pathname به یک دایرکتوری اشاره دارد و دسترسی درخواست شده مربوط به نوشتن (یعنی O_WRONLY یا O_RDWR تنظیم شده است).

EACCES

دسترسی درخواست شده به پرونده مجاز نیست، یا یکی از دایرکتوری ها در نام پنهان اجازه اجازه جستجو (اجرا) را اجازه نمی دهد، یا فایل هنوز وجود نداشته و دسترسی به پوشه های والدین مجاز نیست.

ENAMETOOLONG

راه طولانی بود

ENOENT

O_CREAT تنظیم نشده است و فایل نامی وجود ندارد یا یک جزء دایرکتوری در pathname وجود ندارد یا یک لینک نمادین آویزان است.

ENOTDIR

جزء مورد استفاده به عنوان دایرکتوری در pathname در واقع یک دایرکتوری نیست، یا O_DIRECTORY مشخص شد و pathname دایرکتوری نبود.

ENXIO

O_NONBLOCK | O_WRONLY تنظیم شده است، فایل نامگذاری یک FIFO است و هیچ پردازش فایل را برای خواندن باز نمی کند. یا، فایل یک فایل خاص دستگاه است و هیچ دستگاه مربوطه وجود ندارد.

ENODEV

pathname به یک فایل خاص دستگاه اشاره می کند و هیچ دستگاه متفاوتی وجود ندارد. (این یک اشکال هسته لینوکس است - در این وضعیت ENXIO باید بازگردانده شود.)

EROFS

pathname به یک فایل در یک فایل سیستم فقط خواندنی اشاره می کند و دسترسی به نوشتن درخواست شده است.

ETXTBSY

pathname اشاره به یک تصویر اجرایی است که در حال حاضر اجرا می شود و دسترسی به نوشتن درخواست شده است.

EFAULT

نقطه مسیر نقطه خارج از فضای آدرس قابل دسترسی شما است.

ELOOP

بیش از حد بسیاری از لینک های نمادین در حل پهنای بلاعوض مواجه شدند، یا O_NOFOLLOW مشخص شد اما pathname یک لینک نمادین بود.

ENOSPC

pathname ایجاد شد، اما دستگاه حاوی pathname فضای جدیدی برای فایل جدید ندارد.

ENOMEM

حافظه کافی هسته در دسترس بود

EMFILE

این فرایند حداکثر تعداد فایل ها را باز می کند.

ENFILE

محدودیت تعداد فایل های باز شده در سیستم رسیده است.

مطابق با

SVr4، SVID، POSIX، X / OPEN، BSD 4.3 پرچم های O_NOFOLLOW و O_DIRECTORY به صورت خاص لینوکس هستند. ممکن است مجبور باشیم مقادیر _GNU_SOURCE را برای تعریف آنها تعریف کنیم.

محدودیت های

در پروتکل NFS وجود دارد که در میان O_SYNC و O_NDELAY تأثیر می گذارد .

POSIX برای سه نوع مختلف I / O هماهنگ فراهم می کند که مربوط به پرچم O_SYNC ، O_DSYNC و O_RSYNC است . در حال حاضر (2.1.130) این همه در لینوکس مترادف هستند.