בכל מימוש של 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 כנראה אין מקביל מודרני.