תקציר
#include
תיאור
הפתוח () מערכת לינוקס להתקשר המערכת משמשת כדי להמיר pathname לתוך מתאר קובץ (קטן, שלם שלילי שלילי לשימוש הבא אני / 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 (למשל, שילוב שם מארח ו 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 אובאיחור
כאשר ניתן, הקובץ נפתח במצב ללא חסימה. גם לאפתוח ולא כל הפעולות הבאות על מתאר הקובץ אשר יוחזר יגרום תהליך השיחה לחכות. לטיפול ב - FIFO (ראה צינורות) ראה גםFIFO(4). מצב זה לא צריך להיות כל השפעה על קבצים אחרים מאשר FIFOs.
O_SYNC
הקובץ נפתח עבור קלט / פלט סינכרוני. כללכתובs על מתאר הקובץ המתקבל יחסום את תהליך הקריאה עד שהנתונים נכתבים פיזית לחומרה הבסיסית. עם זאת, ראה 'הגבלות'.
O_NOFOLLOW
אם שם נתיב הוא חוליה סימבולית, ואז הפתיחה נכשלת. זהו הרחבה FreeBSD, אשר נוספה לינוקס בגרסה 2.1.126. קישורים סמליים במרכיבים קודמים של נתיב הנתיב עדיין יישארו. הכותרות מ- glibc 2.0.100 ואילך כוללות הגדרה של דגל זה; גרעינים לפני 2.1.126 יתעלם ממנו אם משתמשים בו .
O_DIRECTORY
אם שם נתיב היא לא ספרייה, לגרום לפתוח להיכשל. הדגל הזה הוא ספציפי ל- Linux, והוא נוסף בגרסת ליבה 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 |. ערך החזרה פתוח וCreat החזר את מתאר הקובץ החדש, או -1 אם אירעה שגיאה (ובמקרה זה, טעות מוגדר כראוי). שים לב שפתוח יכול לפתוח קבצים מיוחדים במכשיר, אבלCreat לא ניתן ליצור אותם - להשתמשmknodבמקום זאת. במערכות קבצים NFS עם מיפוי UID מופעל,פתוח עשוי להחזיר מתאר קובץ, אך לדוגמה. לקרוא(2) בקשות נדחותחלופות. הסיבה לכך היא כי הלקוח מבצעפתוח על ידי בדיקת ההרשאות, אך מיפוי ה- 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.3O_NOFOLLOW וO_DIRECTORY הדגלים הם ספציפיים לינוקס. ייתכן שיהיה צורך להגדיר את_GNU_SOURCE מאקרו כדי לקבל את ההגדרות שלהם. יש הרבה inflicities בפרוטוקול הבסיסי NFS, המשפיעים בין היתרO_SYNC ובאיחור. POSIX מספק שלוש גרסאות שונות של I / O מסונכרנות, המתאימות לדגליםO_SYNC , O_DSYNC ו O_RSYNC. כיום (2.1.130) כל אלה הם מילים נרדפות תחת לינוקס. שגיאות
בהתאם
הגבלות




