Telegram Web Link
#ctime #time.h #time
🔵زمان (time)

🔹تابع time

time_t time (time_t* timer);

این تابع زمان فعلی سیستم را داخل متغیری که ما مشخص می کنیم قرار می دهد ولی این تابع زمان را بر حسب ثانیه بر می گرداند.
یعنی مثلا اگر زمان فعلی سیستم 00:02:34 باشد این تابع مقدار 153 را بر می گرداند به این دلیل که زمان دو دقیقه و سی و چهار ثانیه از 153 ثانیه تشکیل شده است.
حال باید با استفاده از تابع localtime و یک متغیر دیگر(که یک struct از نوع tm هست) به زمان استاندارد آن را تبدیل کنیم.

🔹پارامتر ها :

🔻مفهوم timer* :
این همان اشاره گر ازنوع time_t هست که می خواهیم زمان را داخل آن نگه داریم.

🔹مقادیر بازگشتی :
اگر تابع بتواند زمان را بگیرد تعداد ثانیه هایش را بر می گرداند ولی اگر نتواند مقدار منفی یک (1-) را بر می گرداند.

#include <iostream>
#include <ctime>
using namespace std;

int main( )
{
Time_t tim;
Time(&tim);
cout<<tim<<endl;
}


Output :
1742940573

این برنامه ابتدا یک متغیر از نوع time_t تعریف می کند بعد آدرس آن را (منظور یک اشاره گر به جایی که tim داخلش ذخیره شده) به تابع time می دهد.
این تابع هم زمان را بر حسب ثانیه داخل جایی که tim اشاره می کند قرار می دهد سپس آن نمایش می دهد.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #clock
🔵زمان (time)

🔹تابع clock
clock_t clock(void);

آیا دوست دارید بدانید برنامه تان چند ثانیه برای اجرا زمان گرفته است ؟؟؟
این تابع به این صورت کار می کند که زمان سپری شده توسط CPU که برای برنامه ی شما مصرف شده را بر می گرداند ولی مقداری که این تابع بر می گرداند بر حسب clock_t هست.

🔹مقادیر بازگشتی :
تابع اگر بتواند زمان را محاسبه کند یک عدد در قالب clock برای ما می فرستد اگر نتواند مقدار منفی یک (1-) را بر می گرداند.

⚠️ ممکن است شما یک برنامه را روی چند تا کامپیوتر تست کنید اگر جواب های مختلف گرفتید تعجب نکنید چون ممکن است سرعت پردازنده ها با هم فرق کند یا اگر روی دو کامپیوتر کاملا مشابه در دو محیط مختلف تست کردید و جواب متفاوتی دیدید ممکن است شرایط محیطی روی کار پردازنده تاثیر گذاشته باشد...

1. #include <iostream>
2. #include <ctime>
3. using namespace std;

4. int main( )
5. {
6. clock clk;
7. for(int i=0;i<=9999;i++)
8. {
9. cout<<i<<endl;
10. }
11. clk=clock( );
12. cout<<clk<<endl;
13. return 0;
14. }


Output :
1001

در خط 8 حلقه اعداد 0 تا 9999 را چاپ می کند تا زمانی تلف شود.
در خط 12 زمان را داخل متغیر clk قرار می دهیم و سپس آن چاپ می کنیم.
اما همان طور که می بینید یک عدد بر می گرداند که امکان ندارد زمان برنامه باشد یعنی یک حلقه ی کوچک 1001 ثانیه طول می کشد ؟؟؟
خوب پس چطوری به یک عدد معقول تبدیلش کنیم ؟؟؟
برای این کار باید clk را به یک عدد float تبدیل کنیم بعد بر ثابت CLOCKS_PER_SEC تقسیمش کنیم.

برای درک بهتر به مثال پایین توجه کنید:
cout<<((float)clk)/ CLOCKS_PER_SEC<<endl;

1. #include <iostream>
2. #include <ctime>
3. using namespace std;

4. int main( )
5. {
6. clock clk;
7. for(int i=0; i<=999; i++)
8. {
9.// دستورات
10. }
11. clk=clock( );
12. for(int j=0;j<=99999;j++)
13. {
14.// دستورات
15. }
16. clk=clock( )–clk;
17. cout<<((float)clk)/CLOCKS_PER_SEC<<endl;
18. return 0;
19. }


🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #difftime
🔵زمان (time)

🔹تابع difftime

double difftime(time_t end,time_t beginning);

این تابع اختلاف دو زمان را که به صورت زمان غیر استاندارد(یا همان time_t است)را محاسبه می کند.
البته درست این است که این تابع فقط نوع time_t که همان ثانیه ها هست را محاسبه می کند ولی می توانیم کاری کنیم که حتی اختلاف ماه و سال و روز را هم محاسبه کنیم.


🔹پارامتر ها :

🔻مفهوم end :
این همان زمان اولیه است که می خواهیم اختلافش تا زمان ثانویه را محاسبه کنیم.

🔻مفهوم beginning :
این همان زمان ثانویه است.

🔹مقادیر بازگشتی :
یک مقدار از نوع double که همان اختلاف زمان به ثانیه است

#include <iostream>
#include <ctime>
using namespace std;

int main( )
{
time_t tim1,tim2;
double s;
time(&tim1);
for(int i=0;i<=9999;i++)
{
//دستورات
}
time(&tim2);
s=difftime(tim1,tim2);
cout<<s<<endl;
return 0;
}

مثال بالا زمان تلف شده توسط یک تکه کد را محاسبه می کند.

#include <iostream>
#include <time.h>
/* time_t, struct tm, difftime, time, mktime */
using namespace std;

int main ( )
{
time_t now;
struct tm newyear;
double seconds;

time(&now);
/*get current time;same as:now=time(NULL) */

newyear=*localtime(&now);

newyear.tm_hour=0;
newyear.tm_min=0;
newyear.tm_sec=0;
newyear.tm_mon=0;
newyear.tm_mday=1;

seconds=difftime(now,mktime(&newyear));

cout<<seconds since new year in the current timezone.\n"<<seconds;

return 0;
}


Output:
3777291 seconds since new year in the current timezone.

برنامه بالا یک مثال برای پیدا کردن اختلاف روز است.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #asctime
🔵زمان (time)

🔹تابع asctime

char* asctime (const struct tm * timeptr);

این تابع می تواند یک زمان استاندارد را تبدیل به یک رشته کند.
اگر یک زمان را به فرمت struct tm بنویسیم برای نمایش دادن آن مجبوریم هر کدام از واحد های زمانی را جدا جدا نمایش دهیم ولی این تابع همه ی آنها را کنار هم قرار داده و سپس به رشته تبدیل می کند.

🔹پارامتر ها :

🔻مفهوم timeptr* :
این همان زمان استانداردی است که می خواهیم آن را به رشته تبدیل کنیم.

🔹مقادیر بازگشتی :
مقدار بازگشتی این تابع یک اشاره گر به ابتدای یک رشته است که حاوی زمان است.
فرمت زمانی که بر می گرداند به صورت زیر است:
Www Mmm dd hh:mm:ss yyyy

www هفته
mmm ماه
dd روز
hh:mm:ss زمان
yyyy سال

🔻کد تابع asctime :

char *asctime(const struct tm *timeptr)
{
static const char wday_name[ ][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

static const char mon_name[ ][4]={"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"};

static char result[26];
Cout<<result<<\n
<<wday_name[timeptr->tm_wday]
<<mon_name[timeptr->tm_mon]
<<timeptr->tm_mday
<<timeptr->tm_hour
<<timeptr->tm_min
<<timeptr->tm_sec
<<1900 + timeptr->tm_year;
return result;
}


#include <iostream>
#include <ctime>
using namespace std;

int main ( )
{
time_t rawtime;
struct tm *timeinfo;

time (&rawtime);
timeinfo=localtime(&rawtime);
cout<<"The current date/time is:"<<asctime(timeinfo));

return 0;
}


Output:
The current date/time is: Wed Feb 13 15:46:11 2013

در این مثال ابتدا یک زمان را که غیر استاندارد است را با استفاده از تابع time می گیریم سپس با localtime آن را به یک زمان استاندارد تبدیل می کنیم، در آخر با asctime به یک رشته تبدیلش می کنیم و سپس آن را نمایش می دهیم.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #ctime
🔵زمان (time)

🔹تابع ctime

char *ctime(const time_t *timer);

این تابع شبیه تابع asctime است.
تنها تفاوتش این است که ورودی تابع asctime یک struct tm است،
ولی ورودی تابع ctime یک time_t است حتی مقادیر بازگشتی هر دو تابع مثل هم هستند.
زمانی که از این تابع استفاده می کنید مثل این است که از دستور زیر استفاده می کنید :
asctime(localtime(timer));


#include <iostream>
#include <ctime>
using namespace std;

int main ( )
{
time_t rawtime;
time(&rawtime);
cout<<"The current local time is:"<<ctime(&rawtime);
return 0;
}


Output:
The current local time is: Wed Feb 13 16:06:10 2013

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #localtime
🔵زمان (time)

🔹تابع localtime

struct tm * localtime (const time_t * timer);

آموزش مبحث تبدیل زمان :
اگر بخاطر بیاورید در آموزش های قبلی گفته شد که تابعی به نام time داریم که کار این تابع این است که زمان فعلی سیستم را بر حسب ثانیه به ما بدهد اما آن زمان را به زمان استاندارد تبدیل می کردیم.
حالا با تابع localtime می توانیم آن را به زمان استاندارد تبدیل کنیم.
و اما struct tm چیست ؟؟؟
این یک ساختاره داده ای است که فیلدهایی دارد و با استفاده از این فیلدها می توانیم به مقادیر ساعت، دقیقه و ثانیه دسترسی داشته باشیم البته به روز و ماه و سال هم می توانیم دسترسی داشته باشیم.


🔹پارامتر ها :
🔻مفهوم timer* :
این دقیقا همان زمانی است که با استفاده از تابع ( )time به دست می آوریم.

🔹مقادیر بازگشتی :
این تابع یک اشاره گر به یک struct با نام tm می دهد که داخل آن struct زمان های استانداردی مثل ثانیه و دقیقه نگهداری می شود.
اگر بخواهیم به زبان ساده تر بیان کنیم در اصل فیلدهای struct tm را با مقادیر استاندارد پر می کند.


#include <iostream>
#include <ctime>
using namespace std;

int main ( )
{
time_t tim;
tm *stim;
time(&tim);
stim=localtime(&tim);
cout<<stim->tm_hour<<":"
<<stim->tm_min<<":"
<<stim->tm_sec<<endl;
return 0;
}


Output :
00:21:38

ابتدا زمان غیر استاندارد سیستم، که فقط شامل ثانیه ها می شود را به اضافه تابع time در tim می ریزیم سپس با استفاده از localtime زمان استاندارد را در stim می ریزیم حال می توانیم با استفاده از فیلدهای stim به زمان های استاندارد دقیقه، ساعت و ... هم دسترسی داشته باشیم.
با سرچ بیشتر می توانید بهتر متوجه مطلب شوید.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #strftime
🔵زمان (time)

🔹تابع strftime

size_t strftime (char* ptr, size_t maxsize, const char* format,const struct tm* timeptr );

این تابع هم برای تبدیل کردن زمان به رشته با فرمتی خاص به کار می رود.
در این تابع دقیقا عین تابع ( )printf عمل می کنیم، یعنی برای هر کدام از زمان ها مثل ماه، سال یا روز باید یک کاراکتر خاص را بلد باشیم.
مثل تابع ( )printfکه برای نشان دادن هرکدام از انواع داده ها باید از یک کاراکتر فرمت خاصی راحفظ باشیم.

🔹پارامتر ها :

🔻مفهوم ptr* :
این یک اشاره گر به ابتدا آرایه ای است که می خواهیم زمان را داخلش بریزیم.

🔻مفهوم Maxsize :
همان‌ طول آرایه است که وارد تابع می شود تا تابع بداند چه مقدار حافظه برای نوشتن دارد.

🔻مفهوم format* :
همانطور که می دانید یک رشته حاوی کاراکترهایی است که به طور منظم کنار هم قرار گرفته تا معنی دار باشند، به همین نظم و ترتیب خاص فرمت رشته می گوییم.
حال می توانیم به طرق مختلف فرمت رشته را عوض کنیم مثلا یک رشته را به عدد تبدیل کنیم یا برعکس حالا گاهی لازم است یک زمان را به رشته تبدیل کنیم باید به strftime بگوییم که این کدام نوعِ زمان است مثل تابع ( )printf شما لیست کاراکتر های فرمت را داخل( )printf می دانید ولی این کاراکتر ها در strftime متفاوت است.
این میشود :
specifier  Replaced by  Example

🔹%a
Abbreviated weekday name *Thu

🔹%A
Full weekday name *Thursday

🔹%b
Abbreviated month name *Aug

🔹%B
Full month name
*August

🔹%c
Date and time
representation
*Thu Aug 23 14:55:02 2001

🔹%C
Year divided by 100 and truncated to integer (00-99) 20

🔹%d
Day of the month, zero-padded (01-31) 23

🔹%D
Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01

🔹%e
Day of the month, space-
padded ( 1-31) 23

🔹%F
Short YYYY-MM-DD date, equivalent to %Y-%m-%d 2001-08-23

🔹%g
Week-based year, last two digits (00-99) 01

🔹%G
Week-based year 2001

🔹%h
Abbreviated month name * (same as %b) Aug

🔹%H
Hour in 24h format (00-23)
14

🔹%I
Hour in 12h format (01-12) 02

🔹%j
Day of the year (001-366) 235

🔹%m
Month as a decimal number (01-12) 08

🔹%M
Minute (00-59) 55

🔹%n
New-line character ('\n')

🔹%p
AM or PM designation PM

🔹%r
12-hour clock time * 02:55:02 pm

🔹%R
24-hour HH:MM time, equivalent to %H:%M 14:55

🔹%S
Second (00-61) 02

🔹%t
Horizontal-tab character ('\t')

🔹%T
ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S 14:55:02

🔹%u
ISO 8601 weekday as number with Monday as 1 (1-7) 4

🔹%U
Week number with the first Sunday as the first day of week one (00-53) 33

🔹%V
ISO 8601 week number (00-53) 34

🔹%w
Weekday as a decimal number with Sunday as 0 (0-6) 4

🔹%W
Week number with the first Monday as the first day of week one (00-53) 34

🔹%x
Date representation * 08/23/01

🔹%X
Time representation * 14:55:02

🔹%y
Year, last two digits (00-99) 01

🔹%Y
Year 2001

🔹%z
ISO 8601 offset from UTC in timezone (1 minute=1, 1 hour=100)
If timezone cannot be determined, no characters ت +100

🔹%Z
Timezone name or abbreviation *
If timezone cannot be determined, no characters CDT
%% A % sign %


🔻مفهوم timeptr* :
همان زمانی است که می خواهیم فرمت آن را عوض کنیم.

🔹مقادیر بازگشتی :
اگر‌ برای این تابع مشکلی پیش نیاید (که معمولا مشکل کم بودن طول آرایه یا نامفهوم بودن محتوای format می شود) و به اندازه ای فضا داشته باشد که بتواند آخر آرایه را با کاراکتر null پر کند، تعداد کاراکتر های نوشته شده در ptr را برمیگرداند و اگر تابع درکار خود شکست بخورد مقدار صفر را برمیگرداند.

#include <stdio.h>/* puts */
#include <time.h>/* time_t, struct tm, time, localtime, strftime */

int main ( )
{
time_t rawtime;
struct tm *timeinfo;
char buffer[80];

time (&rawtime);
timeinfo=localtime(&rawtime);

strftime (buffer,80,"Now it's %I:%M%p.",timeinfo);
puts (buffer);

return 0;
}


output:
Now it's 03:21PM.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #clock_t
🔵زمان (time)

🔹تابع clock_t
type clock_t

تعریفی ابتدایی برای یک حسابگر با قابلیت بالا در ارائه ی تعداد تیک تاک های ساعت

تیک تاک های ساعت واحد هایی از نوع
ثابت(constant) ولی در عین حال تابع سیستم هستند که با تابع clock ارائه می شوند.

🔰ترجمه شده ازسایت
www.cplusplus.com

@Learncpp
#ctime #time.h #time_t
🔵زمان (time)

🔹تابع time_t
type time_t

تعریفی ابتدایی برای یک حسابگر با قابلیت بالا در ارائه ی زمان ها، که با تابع time ارائه می شود.

بنا به دلایلی، به طور کلی به عنوان یک متغیر از نوع عدد صحیح (integer) که حاوی ثانیه های سپری شده از زمان 00:00 و تاریخ یک ژانویه سال 1970 است، تعریف می شود،گرچه بعضی از کتابخانه ها می توانند به شکل دیگری هم آن را ارائه دهند.

برنامه های portable بهتر است که از مقادیر این تابع به صورت مستقیم استفاده نکنند و در عوض از کتابخانه های استاندارد دیگری برای ترجمه ی این تابع به صورت portable بهره بگیرند.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #struct_tm #struct_time
🔵زمان (time)

🔹تابع Struct tm

این ساختار مقادیر استاندارد زمان را داخل خودش دارد و داخل چندین تابع مجبوریم از آن استفاده کنیم.
البته همه ی این مقادیر جدا از هم هستند.
این ساختار 9 عضو دارد که از این قرار
(www.tg-me.com/Learncpp/1377)
هستند.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#ctime #time.h #struct_tm #struct_time
🔵زمان (time)

🔹تابع Struct tm

🔻نمایش 9 عضو تابع struct tm
(www.tg-me.com/Learncpp/1376)

@Learncpp
#ctime #time.h #struct_tm #struct_time
🔵زمان (time)

🔹تابع Struct tm

پرچم ساعت تابستانی (The Daylight Saving Time flag یا tm_isdst) می تواند مقادیر زیر را داشته باشد.

1.مقداری بزرگتر از صفر که نشان دهنده ی روشن بودن این قابلیت در سیستم می باشد.

2.مقدار صفر که نشان دهنده ی خاموش بودن این قابلیت در سیستم می باشد.

3.مقداری کوچکتر از صفر که نشان دهنده ی عدم وجود اطلاعات کافی در سیستم می باشد.

همچنین tm_sec به طور کلی در بازه ی(0 _59)تعریف می شود و مقادیر اضافی برای همسان سازی پرش های ثانیه در سیستم های مختلف استفاده می شود.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
زحمت ترجمه کتابخانه "Signal" را آقای فردین مارابی کشیدن از این بزرگوار بخاطر کمکشون سپاسگزاریم 🙏🌺
@Learncpp
🔸ترجمه کتابخانه "Signal (سیگنال)" از سایت رسمی برنامه نویسان ++C به آدرس
www.cplusplus.com/reference

@Learncpp
#csignal #signal.h

🔵سیگنال (Signal)

🔹کتابخانه Signal

🔸کتابخانه ی سی به منظور مدیریت سیگنال :

🔻بعضی از محیط های اجرایی از سیگنال ها به منظور آگاه سازی از پروسه های در حال اجرای رویدادها مشخص استفاده می کنند.

🔻این رویداد ها ممکن است مربوط به آن خطاهایی باشند که به وسیله ی کد برنامه ایجاد شده اند مثل یک عملیات جبری ناصحیح (مانند تقسیم بر صفر) و یا استثنایی از قبیل یک درخواست برای توقف برنامه.

🔻سیگنال ها عموما حالتی هستند که برنامه مجبور به پایان است و یا یک خطای غیر قابل برگشت روی داده است بنابراین مدیریت یک سیگنال منجر به این می شود که برنامه عملیات پاک سازی قبل از کنسلی را اجرا کند و یا تلاش به ادامه ی کار پس از روی دادن خطا کند.

🔻همه ی محیط های اجرایی ملزوم به تولید سیگنال ها برای موقعی که در کتابخانه ی سی طراحی شده اند نیستند.

🔻بعضی دیگر از محیط ها نه تنها این نوع از سیگنال ها را تولید می کنند بلکه بسیاری از سیگنال ها مشخصه دیگری را نیز تولید می کنند.

🔻ولی در تمامی موارد سیگنال ها به طور صریح از فراخوانی تابعی که مطابق با آن سیگنال بخصوص است تولید می شوند.

🔹توابع

🔻تابع Raise : وضع تابعی که سیگنال را مدیریت می کند.

🔻تابع Signal : یک سیگنال را تولید می کند.

🔹نوع :
Sig-atomic-t (داده ی صحیح)

🔹ثابت های بزرگ

type : macro : signal

🔹int : SIGABRT : توقف های غیر عادی

🔹int : SIGFPE : عملیات های جبری نادرست

🔹int : SIGLLL : تصویر تابع نامعتبر از قبیل ساختار ناصحیح

🔹int : SIGINT : سیگنال های تاثیر گذار برهم

🔹int : SIGSEGV : دسترسی نامعتبر به حافظه

🔹int : SIGTERM : درخواست توقف برنامه

🔹function : SIG_DFL : مدیریت استثنا با یک عمل قراردادی

🔹function : SIG_IGN : رد کردن یک سیگنال

🔹function : SIG_ERR : یک بازگشت بخصوص که نشانگر شکست است

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#csignal #signal.h
🔵سیگنال (Signal)

🔹نوع (type)

🔻جدول ثابت های بزرگ

@Leancpp
#csignal #signal.h #raise
🔵سگینال (signal)

🔹تابع Raise
int raise(int seg);

🔸تولید یک سیگنال :
سیگنال (سیگ) را به برنامه در حال اجرا می فرستد و سیگنال توسط تابع سیگنال مدیریت می شود.

🔹پارامترها

🔻پارامتر Sig :
مقدار سیگنال برای ارسال به تابع است.
ثابت های مارکرو که در پایین معرفی می کنیم مقدار استاندارد سیگنال را شناسایی می کنند.

macro : Signal

▫️SIGABRT :
توقف های غیر عادی

▫️SIGFPE :
عملیات های جبری نادرست

▫️SIGILL :
تصویر تابع نامعتبر از قبیل ساختار ناصحیح

▫️SIGINT :
سیگنال های تاثیر گذار برهم

▫️SIGSEGV :
دسترسی نامعتبر به حافظه

▫️SIGTERM :
درخواست توقف برنامه

پیاده سازی هر کتابخانه امکان فراهم آوردن مقدار سیگنال های اضافه تری را که با این تابع استفاده شود را فراهم می آورد.

🔻مقدار بازگشتی :
اگر موفقیت آمیز باشد صفر را بر می گرداند و در غیر اینصورت یک مقدار غیر صفر را برمی گرداند.

🔻مسیر(گردش) داده :
فراخوانی همزمان این تابع بلا اشکال است و باعث ایجاد اشتباه و دور نمی شود توجه داشته باشید که به هرحال امکان دارد که فرآیند مدیریت بر تمامی قسمت ها اثر گذار باشد.

🔻استثناء ها (++C) :
اگر هیچ تابعی برای مدیریت سیگنال تعریف نشده باشد آن تابع هرگز استثنا تولید نمی کند و در باقی حالت ها رفتار و برخورد تابع بستگی به تابع پیاده سازی شده دارد.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#csignal #signal.h #raise
🔵سیگنال (Signal)

🔹تابع Raise

🔹پارامترها

🔻پارامتر Sig

مطالب بیشتر در
www.tg-me.com/Learncpp/1590

@Learncpp
#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 <stdio.h> 
/* printf */

#include <signal.h>
/* 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
2025/06/30 09:14:25
Back to Top
HTML Embed Code: