Skip to main content

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

Week 9 (יוני 2026)

Week 9 (יוני 2026)
Anonim

תקציר

#include #include #include int פתוח (const char * שם נתיב , int דגלים ); int פתוח (const char * שם נתיב , int דגלים , mode_t מצב ); Creat Creat (const char * שם נתיב , mode_t מצב );

תיאור

הפתוח () מערכת לינוקס להתקשר המערכת משמשת כדי להמיר 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) כל אלה הם מילים נרדפות תחת לינוקס.