פונקציית קריאת POSIX בתכנות C

Posix Read Function C Programing



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

הגדרת פונקציה

לפני שתגדיר את פונקציית הקריאה בקוד שלך, עליך לכלול כמה חבילות נדרשות.







#לִכלוֹל

כך תגדיר את פונקציית הקריאה של POSIX:



>>ssize_t pread(intשֶׁנהָב,בָּטֵל *בוף,גודל_טnbyte, off_t offset);
>>גודל_אינך קורא(intfd,בָּטֵל *בוף,גודל_טnbytes);

ניתן לקחת שלושה ארגומנטים של פרמטרים משיחת שיטת הקריאה:



int fd: מתאר הקובץ של הקובץ שממנו יש לקרוא את המידע. יכול להיות שאנו משתמשים במתאר קבצים שנרכש באמצעות שיחת מערכת פתוחה, או שנוכל פשוט להשתמש ב 0, 1 או 2 בהתייחסות לקלט אופייני, פלט רגיל או שגיאה רגילה, בהתאמה.





בטל *בוף: המאגר או מערך התווים בו יש לשמור ולשמור את נתוני הקריאה.

גודל_ט nbyte: מספר הבייטים שצריך לקרוא מהמסמך לפני החיתוך. ניתן לאחסן את כל המידע במאגר אם המידע לקריאה קצר מ- nbytes.



תיאור

שיטת הקריאה () מנסה לקרוא בתים 'nbyte' לתוך מטמון המאגר שאליו 'buf' מתייחס או מהקובץ המחובר למתאר המסמכים הפתוח 'Fildes' או 'fd'. הוא אינו מגדיר את טיבם של מספר קריאות בו זמנית באותו זרם, פיפ'ו או יחידת מסוף.

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

כאשר המספר הוא 0, read () יזהה את השגיאות המוזכרות להלן. אם אין טעויות, או אם קריאה () אינה מטופלת עם שגיאות, קריאה () מניבה אפס עם ספירה של 0 ולכן אין לה השלכות אחרות.

אם המספר גבוה מ- SSIZE_MAX, לפי POSIX.1, אז התוצאה נקבעת על פי היישום.

ערך החזרה

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

שגיאות

פונקציית הקריאה והקריאה לא תצליח אם יתרחשו שגיאות אלה:

EAGAIN:

תיעוד המסמך או הקובץ 'fd' שייך לקובץ ללא שקע שתויג כבלתי חוסם (O NONBLOCK) ויחסום את הקריאה.

EWOULDBLOCK:

המתאר 'fd' שייך לשקע שתויג כבלתי חוסם (O_NONBLOCK) ויחסום את הקריאה.

EBADF:

ייתכן ש- 'fd' אינו מתאר שמיש, או שהוא אינו פתוח לקריאה.

תוצאה:

זה קורה כאשר 'buf' שלך נמצא מחוץ למרחב הכתובת הנגיש שלך.

EINTR:

לפני קריאת נתוני המידע, ייתכן שהשיחה התפרקה על ידי אות.

בְּחִירָה:

שגיאה זו מתרחשת כאשר מתאר ה- 'fd' שלך מעורב באובייקט שאינו מתאים לקריאה, או שהמסמך התנתק עם הדגל O_DIRECT, וכתובת זו או אחרת מצויינת ב- 'buf', הערך המצוין בספירה ' ', או שקזוז המסמך אינו משויך כראוי.

בְּחִירָה:

יתכן שהתיאור 'fd' נוצר באמצעות קריאה ל- timerfd_create (2), ומאגר הגודל הלא נכון ניתן לקריאה.

EIO:

זוהי שגיאת קלט/פלט. היא מתרחשת כאשר קבוצת תהליכי הרקע מנסה לקרוא מהמסוף הרגולטורי שלה, ואחד או אחר משקיף או חוסם את SIGTTIN, או שקבוצת התהליכים שלה שכולה. סיבה נוספת לשגיאה זו יכולה להיות שגיאת קלט/פלט ברמה נמוכה בינתיים קריאה מדיסק קשיח או קלטת. סיבה אפשרית נוספת ל- EIO בקבצי נתונים ברשת היא הסרת נעילה מייעצת של מתאר הקבצים וכישלון של נעילה זו.

EISDIR:

מתאר הקבצים 'fd' שייך לספרייה.

הערות:

כמו כן עלולות להתרחש שגיאות רבות אחרות, המותנות באובייקט המקושר למתאר 'fd'. שני הטפסים size_t ו- ssize_t הם סוגי נתונים מספריים לא מסומנים ומסומנים המוגדרים על ידי POSIX.1. ב- Linux ניתן לשדר לכל היותר 0x7ffff000 (2,147,479,552) בתים על ידי פונקציית קריאה (ושיחות מערכת שוות ערך), ולהחזיר את מספר הבייטים שהועברו במקור (הן בפלטפורמות של 32 סיביות והן ב- 64 סיביות). עם מערכות קבצים NFS, רק ברגע הראשון שחותמת הזמן משתנה על ידי קריאת זרמי מידע זעירים, שיחות שלאחר מכן לא היו עושות זאת. הוא מופעל על ידי שמירה של מאפיינים בצד הלקוח שכן, למרות שלא כולם, לקוחות NFS הפסיקו לעדכן את השרת באמצעות st_atime (זמן הגישה לקובץ האחרון) וקריאות בצד הלקוח המתממשות מהמאגר של הלקוח לא יפעילו שינויים ב- ST- atime בשרת מכיוון שאין זמינות בצד השרת. על ידי הסרת מטמון תכונות בצד הלקוח, ניתן לגשת למטא נתונים של UNIX, אך הדבר יגדיל משמעותית את העומס על השרת וישפיע על הפרודוקטיביות ברוב המקרים.

דוגמה 01:

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

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

דוגמה 02:

דוגמה נוספת להמחשת הפעלת פונקציית הקריאה ניתנת להלן.

צור קובץ נוסף ורשום את הקוד למטה כפי שהוא נמצא בו. להלן שני מתארים, fd1 ו- fd2, שלשניהם גישה לקובץ שולחן פתוח משלהם. אז עבור foobar.txt, לכל מתאר יש את מיקום הקובץ שלו. הבייט הראשון של foobar.txt מתורגם מ- fd2 והתוצאה היא c = f, לא c = o.

סיכום

קראנו את פונקציית הקריאה של POSIX בתכנות C ביעילות. נקווה שלא נשארו ספקות.