למד את הפקודה לינוקס פתוח

תַקצִיר

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "קובץ: /usr/include/fcntl.h"> fcntl.h> int פתוח (const char * נתיב , דגלים int ); int פתוח (const char * נתיב , דגלים int , מצב modet ); int creat (const char * נתיב , מצב mode_t );

תיאור

פקודת לינוקס של המערכת (open) משמשת להמרת שם נתיב לתיאור קובץ (מספר שלם לא שלילי קטן לשימוש ב- I / O לאחר מכן עם קריאה , כתיבה וכו '). כאשר השיחה מוצלחת, מתאר הקובץ חזר wil להיות מתאר הקובץ הנמוך ביותר לא פתוח כרגע לתהליך. שיחה זו יוצרת קובץ פתוח חדש, שאינו משותף עם כל תהליך אחר. (ייתכן שקבצים פתוחים משותפים יתעוררו באמצעות שיחת המערכת המזלג ) 2 (. מתאר הקובץ החדש יישאר פתוח על פני פונקציות exec (ראה fcntl (2)). קיזוז הקובץ מוגדר לתחילת הקובץ.

דגמי הפרמטרים הם אחד O_RDONLY , O_WRONLY או O_RDWR אשר מבקש לפתוח את הקובץ לקריאה בלבד, לכתוב בלבד או קריאה / כתיבה, בהתאמה, bitwise או 'd עם אפס או יותר מהפעולות הבאות:

O_CREAT

אם הקובץ אינו קיים, הוא ייווצר. הבעלים (מזהה משתמש) של הקובץ מוגדר למזהה המשתמש האפקטיבי של התהליך. בעלות הקבוצה (מזהה קבוצה) מוגדרת למזהה הקבוצה האפקטיבי של התהליך או למזהה הקבוצה של ספריית האב (בהתאם לסוג מערכת הקבצים ולאפשרויות ההר, ולמצב של ספריית האב, ראה, לדוגמה, את הר אפשרויות bsdgroups ו sysvgroups של מערכת הקבצים ext2, כמתואר בהר (8)).

O_EXCL

כאשר משתמשים ב- O_CREAT , אם הקובץ כבר קיים, זוהי שגיאה והפתוח ייכשל. בהקשר זה, קיים קשר סימבולי, ללא תלות במקום שבו נקודותיו. O_EXCL נשבר על מערכות קבצים NFS , תוכניות אשר מסתמכים על זה לביצוע משימות נעילה יכיל מצב מרוץ. הפתרון לביצוע נעילת קובץ אטומי באמצעות lockfile היא ליצור קובץ ייחודי על fs זהה (למשל, שילוב hostname ו pid), להשתמש קישור (2) כדי ליצור קישור lockfile. אם הקישור () מחזיר 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

כאשר ניתן, הקובץ נפתח במצב ללא חסימה. לא הפעולות הפתוחות ולא הפעולות הבאות על מתאר הקובץ המוחזר יגרמו לתהליך הקריאה להמתין. לטיפול ב - FIFO (ראה צינורות), ראה גם. מצב זה לא צריך להיות כל השפעה על קבצים אחרים מאשר FIFOs.

O_SYNC

הקובץ נפתח עבור קלט / פלט סינכרוני. כל כתיבה על מתאר הקובץ שנוצר תחסום את תהליך הקריאה עד שהנתונים נכתבים פיזית לחומרה הבסיסית. עם זאת, ראה 'הגבלות'.

O_NOFOLLOW

אם שם הנתיב הוא קישור סימבולי, הרי שהפתוח נכשל. זהו הרחבה FreeBSD, אשר נוספה לינוקס בגרסה 2.1.126. קישורים סמליים במרכיבים קודמים של נתיב הנתיב עדיין יישארו. הכותרות מ- glibc 2.0.100 ואילך כוללות הגדרה של דגל זה; גרעינים לפני 2.1.126 יתעלם ממנו אם משתמשים בו .

O_DIRECTORY

אם נתיב שם אינו ספריה, לגרום לפתוח להיכשל. דגל זה הוא ספציפי לינוקס, והוא הוסיף בגרסת ליבה 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 יש ברשותו אישור נוסף

SIXIX

00001 אחרים יש לבצע אישור

מצב חייב להיות מוגדר כאשר O_CREAT הוא בדגלים , והוא התעלם אחרת.

Creat שווה לפתוח עם דגלים שווים ל- O_CREAT | O_WRONLY | O_TRUNC .

ערך החזרה

פתח ו- creat יחזיר את מתאר הקובץ החדש, או -1 אם אירעה שגיאה (ובמקרה זה, errno מוגדר כראוי). שים לב לפתוח לפתוח קבצים קבצים מיוחדים, אבל Creat לא יכול ליצור אותם - להשתמש mknod (2) במקום.

במערכות קבצים NFS עם מיפוי UID מופעלת, פתח רשאי להחזיר מתאר קובץ, אבל למשל קריאה (2) בקשות נדחות עם EACCES . הסיבה לכך היא שהלקוח מבצע בדיקה על ידי בדיקת ההרשאות, אך מיפוי ה- UID מבוצע על-ידי השרת בעת קריאה וכתיבה.

אם הקובץ נוצר לאחרונה, השדות atime, ctime, mtime נקבעים לשעה הנוכחית, וכך גם שדות ctime ו- mtime של ספריית האב. אחרת, אם הקובץ השתנה בגלל דגל O_TRUNC, שדות ctime ו- mtime שלו מוגדרים לשעה הנוכחית.

שגיאות

EEXIST

נתיב כבר קיים ו- O_CREAT ו- O_EXCL שימשו.

EISDIR

נתיב מתייחס לספריה וגישה המבוקשת הכתיבה (כלומר, O_WRONLY או O_RDWR מוגדר).

חלופות

הגישה המבוקשת לקובץ אסורה, או שאחת הספריות שבשם הנתיב לא איפשרה לבצע חיפוש (ביצוע), או שהקובץ עדיין לא קיים וגישת כתיבה לספריית האב אינה מותרת.

אנאמטונג

שם הנתיב ארוך מדי.

כובע

O_CREAT אינו מוגדר והקובץ בשם אינו קיים. לחלופין, רכיב ספריה בנתיב אינו קיים או שהוא קישור סימבולי תלוי.

ENOTDIR

רכיב המשמש כמדריך בנתיב הוא לא, למעשה, ספרייה, או O_DIRECTORY צוין שם הנתיב לא היה ספריה.

ENXIO

O_NONBLOCK | O_WRONLY מוגדר, הקובץ בשם הוא FIFO ולא תהליך יש את הקובץ פתוח לקריאה. לחלופין, הקובץ הוא קובץ מיוחד ולא קיים מכשיר תואם.

ENODEV

נתיב מתייחס לקובץ מיוחד של התקן ולא קיים התקן תואם. (זהו באג ליבה של לינוקס - במצב זה ENXIO חייב להיות מוחזר).

EROFS

נתיב מתייחס לקובץ על מערכת קבצים לקריאה בלבד וגישה לכתיבה התבקשה.

ETXTBSY

נתיב מתייחס לתמונת הפעלה המתבצעת כעת וגישה לכתיבה התבקשה.

EFAULT

נקודות נתיב מחוץ לשטח הכתובת הנגיש שלך.

ELOOP

יותר מדי קישורים סמליים נתקלו בפתרון נתיב , או ש O_NOFOLLOW צוין, אך שם הנתיב היה קישור סמלי.

ENOSPC

שם הנתיב היה נוצר אך המכשיר המכיל נתיב אין מקום לקובץ החדש.

ENUMEM

לא היה מספיק זיכרון ליבה זמין.

EMFILE

התהליך כבר פתוח למספר המרבי של קבצים.

ENFILE

המגבלה על סך כל הקבצים הפתוחים במערכת הושגה.

בהתאם

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 הדגלים O_NOFOLLOW ו- O_DIRECTORY הם לינוקס- ספציפיים . ייתכן שיהיה צורך להגדיר את המאקרו _GNU_SOURCE כדי לקבל את ההגדרות שלהם.

הגבלות

יש הרבה inflicities בפרוטוקול הבסיסי NFS, המשפיעים בין O_SYNC אחרים O_NDELAY .

POSIX מספק שלוש גרסאות שונות של I / O מסונכרנות, המתאימות לדגלים O_SYNC , O_DSYNC ו- O_RSYNC . כיום (2.1.130) כל אלה הם מילים נרדפות תחת לינוקס.