کتابخانه پازیکس سی |
---|
|
errno.h یک فایل سرایند در کتابخانه استاندارد زبان برنامهنویسی سی است. در این فایل، تعدادی ماکرو برای گزارشدهی و بازیابی خطاها به کمک یکسری کد خطا، تعریف شده است، که این کدهای خطا در یک محل ایستا از حافظه ذخیره میشوند، که به آن errno میگویند که کوتاهشدهٔ عبارت "error number" است.
وقتی که توابع موجود در کتابخانه استاندارد با خطا مواجه میشوند، این قضیه را با مقداردهی کردن متغیر errno با مقدار مناسب آن خطا، به اطلاع برنامهنویس میرسانند. در ابتدای اجرای برنامه، مقدار این متغیر صفر است. توابع کتابخانهای تنها مقادیر بزرگتر از صفر را در این متغیر ذخیره میکنند.هر تابع موجود در کتابخانه، بسته به اینکه با خطا مواجه شده باشد یا نه، میتواند پیش از برگشتیافتن، مقدار این متغیر را تغییر دهد. بیشتر توابع رخ دادن خطا را با برگشت دادن یک مقدار خاص، مثل NULL (برای توابعی که اشارهگر برمیگردانند) و -1 (برای توابعی که عدد صحیح برمیگردانند) به اطلاع برنامهنویس میرسانند. سپس برنامهنویس میتواند مقدار errno را بررسی کند تا ببینید دقیقاً چه خطایی رخ داده است. تعداد کمی از توابع نیازمند آن هستند که برنامهنویس پیش از فراخوانی آنها، مقدار errno را با 0 مقداردهی کند و سپس پس از اجرای تابع، بررسی کند که آیا تغییر کرده است یا نه تا متوجه رخ دادن خطا شود.
ماکروی errno به صورت تاریخی به شکل زیر تعریف میشود:
extern int errno;
اما در سیستمهای مدرن، برای جلوگیری از ایجاد مشکل در محیطهای همروند، این errno به صورت یک ماکرو تعریف میشود که در نهایت به یک مقدار چپمقدار از نوع int یا volatile int گسترش مییابد. مثلاً در فریبیاسدی به این صورت تعریف شده است:
int * __error(void);
#define errno (* __error())
در این فایل سرایند همچنین تعدادی ماکرو تعریف شده که این ماکروها به یک مقدار int گسترش مییابند که همان کد خطای مورد نظر است. استاندارد سی، تنها تعریف ماکروهای زیر را اجباری کرده، اما پیادهسازیها آزاد هستند تا ماکروهای بیشتری تعریف کنند. استاندارد پازیکس ماکروهای بسیار بیشتری تعریف کرده است.
به معنی این است که پارامتر ارسال شده خارج از دامنه تابع است، مثلاً در فراخوانی sqrt(-1) این خطا رخ میدهد.
وقتی که نتیجه حاصلشده، آنقدر بزرگ باشد که خارج از دامنهٔ تابع باشد، مثلاً در strtol("0xfffffffff",NULL,0) این خطا رخ میدهد.
به معنی این است که تابع در حین دیکد کردن یک دنباله از بایتها، به یک دنباله بایت ناتمام یا غیرمجاز برخورده است. مثلاً در mbstowcs(buf,"\xff", 1) این خطا رخ میدهد.
به طور سنتی، صفحه راهنمای intro(2) در سیستمهای یونیکس، حاوی توضیحاتی در مورد مارکوهای تعریف شده در این فایل است.