משתנים גלובליים אוטומטיים

 

   בכל מימוש של C ישנה סידרה של משתנים גלובליים מוגדרים אוטומטית כמו משתני רשומות הקובץ המגדירים את הקלט מהמקלדת, פלט למסך ופלט להודעות שגיאה:

 

stdin  -  קלט מהמקלדת

 

stdout  - פלט למסך

 

stderr – פלט להודעות שגיאה.

 

  שלושה משתנים הקשורים לקריאות מערכת System Calls  הם המשתנים הגלובליים errno, sys_errlist, sys_nerr.

ההגדרות של המשתנים הללו הן:

extern int errno;

extern int sys_nerr;

extern char *sys_errlist[];

 

 

 

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

  כאשר פניה לקריאת מערכת נכשלת, המערכת מציבה לתוך משתנה errno את המספר הסידורי של הסיבה לכישלון של הפניה.  בכדי לידע את המשתמש או מפתח התוכנית את הסיבה לכישלון, די להדפיס את sys_errlist[errno]. יש רוטינה שעושה את זה למענינו: perror.

 

  חשוב להדגיש כאן שהמושגים "סיבות הכישלון" ו-"הודעות השגיאה" תופסים רק בהקשר של פניות לקריאות מערכת, ולא בתקלות שקשורות בחריגות, כמו חלוקה באפס, אובדן קשר ברשת התקשורת, ניסיון לפעולות לא חוקיות וכו'.

 

הערה:

 

  מערכות Unix חדשות כנראה רוצות להתנער מ-sys_errlist ו-sys_nerr (הם נתמכים אך נחשבים ל-deprecated). זאת כנראה בגלל הקושי לתחזק אותם. מספר סוגי השגיאה גדל למרות כל המאמצים לסגור אותם.  המקביל היום למערך sys_errlist היא קריאת המערכת

char *strerror(int errnum);

ול-sys_nerr כנראה אין מקביל מודרני.