#Csignal #signal.h #signal
🔵 سیگنال (signal)
🔹تابع Signal :
void (*signal(int sig, void (*func)(int)))(int);
🔸قراردادن تابعی به منظور مدیریت سیگنال :
تعیین کردن راهی برای مدیریت سیگنال از شماره ی سیگنال که به سیگ معروف است.
🔸تابع پارامتری شده یکی از سه راهی که می شود سیگنال ها را در برنامه مدیریت کرد را مشخص می کند :
1️⃣ مدیریت اختیار(sig_def) :
سیگنال یک کار دلخواه و رندوم برای یک نوع بخصوص سیگنال انجام می دهد.
2️⃣ نادیده گرفتن (sig_ign) :
سیگنال نادیده گرفته می شود و برنامه به کار خود ادامه می دهد حتی اگر ادامه ی کار بی معنی به نظر برسد.
3️⃣ تابع مدیریت کننده :
تابع بخصوصی برای مدیریت سیگنال تعریف می شود.
🔹پارامترها
🔻پارامتر Sig :
مقدار سیگنالی که برای تابع مدیریت کننده وضع شده است.
🔘 عبارت های ثابت ماکروی زیر مقدارهای استاندارد سیگنال را معرفی می کنند.
macro : Signal
▫️SIGABRT :
توقف های غیر عادی
▫️SIGFPE :
عملیات های جبری نادرست
▫️SIGILL :
تصویر تابع نامعتبر از قبیل ساختار ناصحیح
▫️SIGINT :
سیگنال های تاثیر گذار برهم
▫️SIGSEGV :
دسترسی نامعتبر به حافظه
▫️SIGTERM :
درخواست توقف برنامه
🔸 با پیاده سازی کتابخانه ها امکان دارد مقدار سیگنال های اضافه تری را فراهم آورد که از طریق ثابت های ماکرو قابل استفاده هستند.
⚠️ دقت کنید که همه ی محیط های اجرایی مجبور به تولید اتوماتیک سیگنال ها نیستند، همه ی محیط های اجرایی باید سیگنال های تولید شده توسط تابع raise را دریافت کنند.
🔻تابع Func:
یک اشاره گر به تابع، این ممکن است که یک تابع تعریف شده توسط برنامه نویس باشد و یا یکی از تابع های از قبل تعریف شده ی زیر باشد :
1️⃣ sig_def
2️⃣ sig_ign
▶️ اگر تابعی باشد که توسط برنامه نویس تعریف شده باشد باید فرمی به شکل زیر داشته باشد :
void handler_function (int parameter);
🔻نوع بازگشتی :
نوع بازگشتی درست مانند پارامتر های تابع است، اگر درخواست موفقیت آمیز باشد تابع یک اشاره گر به یک نوع مشخص تابع مدیریت کننده است که در راس مدیریت این سیگنال قبل از اظهار هیچ یا یکی از دو تابع Sig_def ,Sig_ign قرار دارد.
سیگنال فراخوانی شده به صورت دلخواه اجرا می شود و یا نادیده گرفته می شود، اگر تابع در فعال سازی و اجرای تابع های جدید سیگنال به صورت موفقیت آمیز عمل نکند Sib_ebr را بازگشت می دهد و یک عدد مثبت به errno اختصاص می دهد.
مثال )
#include
/* printf */
#include
/* signal, raise, sig_atomic_t */
sig_atomic_t signaled = 0;
void my_handler (int param)
{
signaled = 1;
}
int main ( )
{
void (*prev_handler)(int);
prev_handler = signal(SIGINT, my_handler);
/* ... */
raise(SIGINT);
/* ... */
printf ("signaled is %d.\n",signaled);
return 0;
}
🔻مسیر داده :
فراخوانی این تابع در چندین موقعیت رفتار نامشخصی را به دنبال دارد.
🔻استثناء ها (++C) :
این تابع هرگز یک استثناء را بیرون نمی اندازد.
No-throw guarantee
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵 سیگنال (signal)
🔹تابع Signal :
void (*signal(int sig, void (*func)(int)))(int);
🔸قراردادن تابعی به منظور مدیریت سیگنال :
تعیین کردن راهی برای مدیریت سیگنال از شماره ی سیگنال که به سیگ معروف است.
🔸تابع پارامتری شده یکی از سه راهی که می شود سیگنال ها را در برنامه مدیریت کرد را مشخص می کند :
1️⃣ مدیریت اختیار(sig_def) :
سیگنال یک کار دلخواه و رندوم برای یک نوع بخصوص سیگنال انجام می دهد.
2️⃣ نادیده گرفتن (sig_ign) :
سیگنال نادیده گرفته می شود و برنامه به کار خود ادامه می دهد حتی اگر ادامه ی کار بی معنی به نظر برسد.
3️⃣ تابع مدیریت کننده :
تابع بخصوصی برای مدیریت سیگنال تعریف می شود.
🔹پارامترها
🔻پارامتر Sig :
مقدار سیگنالی که برای تابع مدیریت کننده وضع شده است.
🔘 عبارت های ثابت ماکروی زیر مقدارهای استاندارد سیگنال را معرفی می کنند.
macro : Signal
▫️SIGABRT :
توقف های غیر عادی
▫️SIGFPE :
عملیات های جبری نادرست
▫️SIGILL :
تصویر تابع نامعتبر از قبیل ساختار ناصحیح
▫️SIGINT :
سیگنال های تاثیر گذار برهم
▫️SIGSEGV :
دسترسی نامعتبر به حافظه
▫️SIGTERM :
درخواست توقف برنامه
🔸 با پیاده سازی کتابخانه ها امکان دارد مقدار سیگنال های اضافه تری را فراهم آورد که از طریق ثابت های ماکرو قابل استفاده هستند.
⚠️ دقت کنید که همه ی محیط های اجرایی مجبور به تولید اتوماتیک سیگنال ها نیستند، همه ی محیط های اجرایی باید سیگنال های تولید شده توسط تابع raise را دریافت کنند.
🔻تابع Func:
یک اشاره گر به تابع، این ممکن است که یک تابع تعریف شده توسط برنامه نویس باشد و یا یکی از تابع های از قبل تعریف شده ی زیر باشد :
1️⃣ sig_def
2️⃣ sig_ign
▶️ اگر تابعی باشد که توسط برنامه نویس تعریف شده باشد باید فرمی به شکل زیر داشته باشد :
void handler_function (int parameter);
🔻نوع بازگشتی :
نوع بازگشتی درست مانند پارامتر های تابع است، اگر درخواست موفقیت آمیز باشد تابع یک اشاره گر به یک نوع مشخص تابع مدیریت کننده است که در راس مدیریت این سیگنال قبل از اظهار هیچ یا یکی از دو تابع Sig_def ,Sig_ign قرار دارد.
سیگنال فراخوانی شده به صورت دلخواه اجرا می شود و یا نادیده گرفته می شود، اگر تابع در فعال سازی و اجرای تابع های جدید سیگنال به صورت موفقیت آمیز عمل نکند Sib_ebr را بازگشت می دهد و یک عدد مثبت به errno اختصاص می دهد.
مثال )
#include
/* printf */
#include
/* signal, raise, sig_atomic_t */
sig_atomic_t signaled = 0;
void my_handler (int param)
{
signaled = 1;
}
int main ( )
{
void (*prev_handler)(int);
prev_handler = signal(SIGINT, my_handler);
/* ... */
raise(SIGINT);
/* ... */
printf ("signaled is %d.\n",signaled);
return 0;
}
🔻مسیر داده :
فراخوانی این تابع در چندین موقعیت رفتار نامشخصی را به دنبال دارد.
🔻استثناء ها (++C) :
این تابع هرگز یک استثناء را بیرون نمی اندازد.
No-throw guarantee
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp