سیستم عامل یونیکس از سیگنال ها به عنوان ابزاری برای اطلاع رسانی استفاده می کند که برخی از رویدادها ، که اغلب با فعالیت فعلی فرآیند ارتباط ندارد ، رخ داده است که نیاز به توجه فرایند دارد. سیگنال ها به صورت غیر همزمان به یک فرآیند تحویل داده می شوند. یک فرآیند نمی تواند پیش بینی کند که چه زمانی ممکن است یک سیگنال وارد شود.
این فصل شامل بخش های زیر است:
سیگنال ها از تعدادی از منابع سرچشمه می گیرند:
رابط سیگنال همچنین یک شکل سنتی از ارتباط بین پردازش است. برنامه های چند وظیفه ای به طور خاص از سیگنال ها به عنوان ابزاری برای اجازه دادن به مؤلفه ها برای هماهنگی فعالیت ها در تعدادی از فرآیندها استفاده می کنند. به دلیل ماهیت ناهمزمان سیگنالها ، یک فرآیند می تواند در حالی که منتظر یک رویداد مهم است ، کار مفیدی را انجام دهد (به عنوان مثال ، نیازی به انتظار برای یک سمیفور نیست) و در صورت وقوع این رویداد ، فرایند بلافاصله مطلع می شود.
یک فرآیند می تواند هنگام دریافت سیگنال چه کاری انجام دهد. می تواند:
یک برنامه می تواند به طور متناوب عواقب پیش فرض تحویل یک سیگنال خاص را بپذیرد. این عواقب از سیگنال به سیگنال متفاوت است ، اما می تواند منجر به خاتمه فرآیند ، هسته دامپینگ فرآیند ، سیگنال نادیده گرفته شود ، یا روند راه اندازی مجدد یا ادامه یابد. اقدام پیش فرض اکثر سیگنال ها خاتمه دادن به روند است. اگر خاتمه ناگهانی فرآیند برای طیف گسترده ای از شرایطی که باعث سیگنال ها می شوند مطلوب نباشد ، باید یک برنامه برای مقابله با سیگنال ها به درستی آماده شود.
5. 1 توابع سیگنال POSIX
POSIX 1003. 1 توابع سیگنال قابل اعتماد را که تحت 4. 3BSD و SVR3 توسعه یافته است استاندارد کرد. در جدول 5-1 توابع سیگنال POSIX 1003. 1 ذکر شده است.
جدول 5-1: عملکردهای سیگنال POSIX 1003. 1
عملکرد | شرح |
کشتن | سیگنال را به یک فرآیند یا گروهی از فرآیندها می فرستد |
سیگنال | عملی را که یک فرآیند هنگام تحویل سیگنال خاص انجام می دهد ، مشخص می کند |
سیگاد | سیگنال را به مجموعه سیگنال اضافه می کند |
سیگدل | سیگنال را از مجموعه سیگنال حذف می کند |
سایپت | یک مجموعه سیگنال را به گونه ای آغاز می کند که تمام سیگنال ها از آن خارج شوند |
سیگیلد | یک مجموعه سیگنال را به گونه ای آغاز می کند که تمام سیگنال ها گنجانده شده است |
رگ | آزمایش می کند که آیا یک سیگنال عضو یک مجموعه سیگنال است |
در حال غرق شدن | مجموعه ای از سیگنال را باز می گرداند که نشان دهنده آن سیگنالهایی است که از تحویل به فرآیند مسدود شده اند اما در انتظار هستند |
سیگپ | ماسک سیگنال مسدود شده جریان را تنظیم می کند |
سرپایی | ماسک سیگنال مسدود شده جریان فرآیند را جایگزین می کند ، منتظر سیگنال است و پس از تحویل آن ، کنترل کننده را برای سیگنال ایجاد می کند و باز می گردد |
POSIX 1003. 1b تعریف POSIX 1003. 1 را گسترش داد تا پشتیبانی بهتری از سیگنال ها در محیط های بلادرنگ داشته باشد. جدول 5-2 توابع سیگنال POSIX 1003. 1b را فهرست می کند. یک برنامه بلادرنگ از تابع sigqueue به جای تابع kill استفاده می کند. همچنین ممکن است از تابع sigwaitinfo یا sigtimedwait به جای تابع sigsuspend استفاده کند.
جدول 5-2: عملکردهای سیگنال POSIX 1003. 1b
عملکرد | شرح |
سیگ | یک سیگنال به همراه اطلاعات شناسایی را به یک فرآیند ارسال می کند |
منتظر باشید | منتظر یک سیگنال برای مدت زمان مشخص می شود و اگر سیگنال در آن زمان تحویل داده شود، شماره سیگنال و هرگونه اطلاعات شناسایی فرآیند سیگنال دهی ارائه شده را برمی گرداند. |
sigwaitinfo | منتظر سیگنال می ماند و پس از تحویل آن، شماره سیگنال و هرگونه اطلاعات شناسایی فرآیند سیگنال دهی ارائه شده را برمی گرداند. |
برای توضیح بهتر استفاده از برنامههای افزودنی POSIX 1003. 1b توسط برنامههای بیدرنگ، این فصل ابتدا بر روی اصول مدیریت سیگنال POSIX 1003. 1 تمرکز میکند.
5. 2 اصول مدیریت سیگنال
مثال 5-1 کد فرآیندی را نشان می دهد که فرزندی ایجاد می کند که به نوبه خود یک کنترل کننده سیگنال را ایجاد و ثبت می کند.
مثال 5-1: ارسال سیگنال به یک فرآیند دیگر
در این مثال:
همانطور که در مثال 5-1، تحت POSIX 1003. 1، یک فرآیند با استفاده از تابع kill سیگنالی را به فرآیند دیگری ارسال می کند. اولین آرگومان تابع kill، شناسه فرآیند فرآیند دریافت یا یکی از مقادیر ویژه زیر است:
ارزش | شرح |
0 | سیگنال را به همه فرآیندها با همان شناسه گروه فرآیند فرستنده ارسال می کند |
-1 | سیگنال را به همه فرآیندها با شناسه گروه فرآیند برابر با شناسه کاربر مؤثر فرستنده ارسال می کند |
آرگومان دوم تابع kill نام یا شماره سیگنالی است که باید ارسال شود.
بررسی مجوزهای مجاز توسط اولین آرگومان کمک می کند تا اطمینان حاصل شود که سیگنال هایی که به طور خودسرانه یا تصادفی هر فرآیندی را در سیستم خاتمه می دهند، ارسال نمی شوند. از آنجایی که یک فرآیند باید شناسه کاربری یکسان یا شناسه کاربر مؤثر را به عنوان فرآیندی که سیگنال می دهد داشته باشد، اغلب این اتفاق می افتد که این فرآیندها را ایجاد کرده یا به صراحت تابع setuid نامیده می شود تا شناسه های کاربر مؤثر خود را تنظیم کند. برای بحث بیشتر در مورد تابع kill به صفحه مرجع kill (2) مراجعه کنید.
مجموعه کامل سیگنال های پشتیبانی شده توسط سیستم عامل DIGITAL UNIX در signal. h تعریف شده و در صفحه مرجع سیگنال (4) مورد بحث قرار گرفته است. POSIX 1003. 1 و POSIX 1003. 1b به زیر مجموعه ای از این سیگنال ها نیاز دارند. این زیر مجموعه در جدول 5-3 فهرست شده است.
جدول 5-3: سیگنال های POSIX
علامت | شرح | اقدام پیش فرض |
SIGABRT | فرآیند لغو (به سقط (3) مراجعه کنید) | خاتمه فرآیند و تخلیه هسته |
SIGALRM | انقضای ساعت زنگ دار | خاتمه فرآیند |
SIGFPE | استثنای حسابی (مانند عملیات تقسیم بر صفر عدد صحیح یا استثنای ممیز شناور) | خاتمه فرآیند و تخلیه هسته |
SIGHUP | قطع کردن | خاتمه فرآیند |
SIGILL | دستورالعمل نامعتبر | خاتمه فرآیند و تخلیه هسته |
SIGINT | قطع کنید | خاتمه فرآیند |
SIGKILL | کشتن (نمی توان دستگیر، مسدود یا نادیده گرفت) | خاتمه فرآیند |
SIGPIPE | روی لوله ای بنویسید که فرآیند خواندن ندارد | خاتمه فرآیند |
SIGQUIT | ترک کنید | خاتمه فرآیند و تخلیه هسته |
SIGSEGV | نقض تقسیم بندی (دسترسی به حافظه). | خاتمه فرآیند و تخلیه هسته |
SIGTERM | خاتمه نرم افزار | خاتمه فرآیند |
SIGUSR1 | برنامه تعریف شده است | خاتمه فرآیند |
SIGUSR2 | برنامه تعریف شده است | خاتمه فرآیند |
سیگچلد | خاتمه فرزند (ارسال به والدین) | نادیده گرفته شد |
SIGSTOP | توقف (نمی توان دستگیر، مسدود یا نادیده گرفت) | فرآیند متوقف شد (تعلیق) |
SIGTSTP | توقف تعاملی | فرآیند متوقف شد (تعلیق) |
SIGCONT | در صورت توقف ادامه دهید (نمی توان آن را گرفت، مسدود کرد یا نادیده گرفت) | فرآیند دوباره شروع شد (از سر گرفته شد) |
SIGTTOU | نوشتن پسزمینه برای کنترل پایانه تلاش شد | فرآیند متوقف شد (تعلیق) |
SIGTTIN | خواندن پسزمینه از ترمینال کنترل انجام شد | فرآیند متوقف شد (تعلیق) |
SIGRTMIN-SIGRTMAX | سیگنال های اضافی تعریف شده توسط برنامه کاربردی ارائه شده توسط POSIX 1003. 1b | خاتمه فرآیند |
5. 2. 1 مشخص کردن یک عمل سیگنال
تابع sigaction به یک فرآیند اجازه می دهد تا اقدامی را که باید برای یک سیگنال مشخص انجام شود مشخص کند. هنگامی که یک کنش مدیریت سیگنال را با فراخوانی تابع sigaction تنظیم میکنید، این عمل تا زمانی که آن را با یک فراخوانی دیگر به تابع sigaction بازنشانی کنید، تنظیم میشود.
اولین آرگومان تابع sigaction سیگنالی را مشخص می کند که عمل باید برای آن تعریف شود. آرگومان های دوم و سوم، مگر اینکه به صورت NULL مشخص شوند، ساختارهای sigaction را مشخص می کنند:
ساختار sigaction دارای دو فرمت مختلف است که در signal. h تعریف شده است، که با این تفاوت که عضو sa_handler یک کنترل کننده سیگنال سنتی POSIX 1003. 1 یا یک کنترل کننده سیگنال بیدرنگ POSIX 1003. 1b را مشخص می کند:
برای مدیریت سیگنال POSIX 1003. 1:
برای مدیریت سیگنال POSIX 1003. 1b:
باقیمانده این بخش بر تعریف یک کنترل کننده سیگنال سنتی در عضو SA_HANDLER از ساختار SIGACTION متمرکز است. توجه داشته باشید که ، برای سیگنال های زمان واقعی (آنهایی که به عنوان sigrtmin از طریق SIGRTMAX تعریف شده اند ، عضو SA_Sigaction را تعریف می کنید ، نه عضو SA_HANDLER. بخش 5. 3 تعریف یک کنترل کننده سیگنال در زمان واقعی را در عضو SA_SIGACTION شرح می دهد.
برای شناسایی عملکرد مرتبط با یک سیگنال خاص ، از عضو SA_HANDLER از ساختار SIGACTION استفاده کنید:
قسمت SA_MASK مجموعه ای از سیگنال های اضافی را که باید به ماسک سیگنال فعلی فرایند اضافه شود قبل از اینکه در واقع کنترل کننده سیگنال فراخوانی شود ، مشخص می کند. این ماسک سیگنال ، به علاوه سیگنال فعلی ، در حالی که کنترل کننده سیگنال فرآیند در حال اجرا است ، فعال است (مگر اینکه با تماس دیگری به عملکرد SIGAction اصلاح شود ، یا تماس با توابع Sigprocmask یا Sigsuspend). اگر کنترل کننده سیگنال با موفقیت تکمیل شود ، ماسک اصلی ترمیم می شود.
عضو SA_FLAGS پرچم های مختلفی را مشخص می کند که اعزام سیستم عامل سیگنال را هدایت می کند. برای لیست کامل این پرچم ها و توضیحات معنای آنها ، به صفحه مرجع SIGACTION (2) مراجعه کنید.
5. 2. 2 تنظیم ماسک های سیگنال و مسدود کردن سیگنال ها
یک فرآیند سیگنال را برای محافظت از بخش های خاصی از کد از دریافت سیگنال در هنگام قطع کد مسدود می کند. بر خلاف نادیده گرفتن سیگنال ، مسدود کردن سیگنال تحویل سیگنال را تا زمانی که فرآیند آماده رسیدگی به آن باشد ، به تعویق می اندازد. یک سیگنال مسدود شده به عنوان در انتظار هنگام ورود مشخص می شود و به محض آزاد شدن بلوک اداره می شود. تحت POSIX 1003. 1 ، وقایع متعدد از همان سیگنال ذخیره نمی شوند. یعنی اگر سیگنال دوباره تولید شود در حالی که سیگنال در حال انتظار است ، فقط یک نمونه از سیگنال تحویل داده می شود. قابلیت صف سیگنال معرفی شده در POSIX 1003. 1b اجازه می دهد تا چندین مورد از همان سیگنال حفظ و تمایز یابد (به بخش 5. 3 مراجعه کنید).
هر فرآیند دارای یک ماسک سیگنال مرتبط است که تعیین می کند کدام سیگنال ها به آن تحویل داده می شوند و کدام سیگنال ها از تحویل مسدود می شوند.(یک فرایند کودک ماسک سیگنال والدین خود را هنگام چنگال والدین به ارث می برد.) هر بیت یک سیگنال را نشان می دهد ، همانطور که در پرونده هدر سیگنال تعریف شده است. به عنوان مثال ، اگر بیت n در ماسک تنظیم شود ، سیگنال N مسدود می شود.
همانطور که در فصل 2 توضیح داده شده است ، سیستم عامل دیجیتال یونیکس در واقع موضوعات را برنامه ریزی می کند ، نه فرآیندها. برای برنامه های چند رشته ای ، با استفاده از عملکرد pthread_kill می توان سیگنال را به یک موضوع تحویل داد و ماسک سیگنال نخ را می توان با استفاده از عملکرد pthread_sigmask ایجاد کرد. این توابع در کتابخانه decthreads posix 1003. 1c (libpthread. so) ارائه شده است. برای بحث در مورد استفاده از سیگنال ها با برنامه های چند رشته ای ، به صفحات مرجع مناسب و راهنمای decthreads مراجعه کنید.
شکل 5-1 ماسک را مسدود می کند که دو سیگنال را مسدود می کند. در این تصویر ، دو بیت سیگنال تنظیم شده است که تحویل سیگنال برای سیگنال های مشخص شده را مسدود می کند.
شکل 5-1: ماسک سیگنال که دو سیگنال را مسدود می کند
عملکرد SIGProcMask به شما امکان می دهد ماسک سیگنال فرآیند فراخوانی را جایگزین یا تغییر دهید. مقدار اولین آرگومان برای این عملکرد عمل انجام شده را تعیین می کند:
ارزش | شرح |
SIG_BLOCK | مجموعه سیگنال های مشخص شده در آرگومان دوم را به ماسک سیگنال فرایند اضافه می کند |
sig_unblock | مجموعه سیگنال های مشخص شده در آرگومان دوم را از ماسک سیگنال فرآیند تفریق می کند |
sig_setmask | ماسک سیگنال فرآیند را با مجموعه سیگنال های مشخص شده در آرگومان سوم جایگزین می کند |
آرگومان سوم برای عملکرد Sigprocmask یک ساختار SIGSET_T است که ماسک سیگنال قبلی فرآیند را دریافت می کند.
قبل از فراخوانی عملکرد SIGProcMask ، شما از عملکرد Sigemptyset یا Sigfillset برای ایجاد مجموعه سیگنال (یک ساختار SIGSET_T) استفاده می کنید که به عنوان آرگومان دوم آن ارائه می دهید. عملکرد SIGEMPTYSET یک مجموعه سیگنال و بدون سیگنال در آن ایجاد می کند. تابع SigFillset یک مجموعه سیگنال حاوی تمام سیگنال ها ایجاد می کند. شما با فراخوانی توابع Sigaddset و Sigdelset ، مجموعه سیگنال های ایجاد شده را با یکی از این توابع تنظیم می کنید. می توانید تعیین کنید که آیا یک سیگنال داده شده عضو سیگنال است که با استفاده از عملکرد Sigismember تنظیم شده است یا خیر.
عملکرد Sigprocmask نیز زمانی مفید است که می خواهید ماسک را تنظیم کنید اما مطمئن نیستید که هنوز سیگنال ها مسدود شده اند. می توانید ماسک سیگنال فعلی را با فراخوانی Sigprocmask (SIG_BLOCK ، NULL و OLDMASK) بازیابی کنید.
پس از ارسال سیگنال ، تحویل داده می شود ، مگر اینکه تحویل مسدود شود. هنگام مسدود شدن ، سیگنال در انتظار مشخص شده است. سیگنال های در انتظار بلافاصله پس از انسداد آنها تحویل داده می شوند. برای تعیین اینکه آیا یک سیگنال مسدود شده در انتظار است ، از عملکرد sigpending استفاده کنید.
5. 2. 3 یک فرآیند را به حالت تعلیق در می آورد و منتظر سیگنال است
تابع sigsuspend ماسک سیگنال یک فرآیند را با ماسکی که به عنوان تنها آرگومان آن مشخص شده است جایگزین میکند و منتظر تحویل سیگنال مسدود نشده میماند. اگر تحویل سیگنال باعث شود که یک کنترل کننده سیگنال اجرا شود، تابع sigsuspend پس از تکمیل کنترل کننده سیگنال، پس از بازگرداندن ماسک سیگنال فرآیند به حالت قبلی خود، باز می گردد. اگر تحویل سیگنال باعث خاتمه فرآیند شود، تابع sigsuspend باز نمی گردد.
از آنجایی که sigsuspend ماسک سیگنال را تنظیم میکند و منتظر سیگنال مسدود شده در یک عملیات اتمی میشود، فرآیند فراخوانی تحویل سیگنالی را که ممکن است درست قبل از تعلیق رخ دهد از دست نمیدهد.
یک فرآیند معمولاً از تابع sigsuspend برای هماهنگی با تکمیل ناهمزمان برخی از کارها توسط یک فرآیند دیگر استفاده می کند. به عنوان مثال، ممکن است هنگام اجرای یک بخش بحرانی سیگنال های خاصی را مسدود کند و پس از اتمام آن منتظر سیگنال باشد:
5. 2. 4 راه اندازی یک پشته سیگنال جایگزین
مشخصات XPG4-UNIX تابع sigaltstack را تعریف می کند تا به یک فرآیند اجازه دهد تا یک ناحیه پشته گسسته را تنظیم کند که در آن سیگنال ها می توانند پردازش شوند. اگر عضو sa_flags ساختار sigaction برای سیگنال، پرچم SA_ONSTACK را مشخص کند، پشته سیگنال جایگزین استفاده می شود.
ساختار stack_t ارائه شده به فراخوانی تابع sigaltstack، پیکربندی و استفاده از پشته سیگنال جایگزین را با مقادیر اعضای زیر تعیین میکند:
برای اطلاعات بیشتر در مورد تابع sigaltstack (2) به صفحه مرجع sigaltstack (2) مراجعه کنید.
5. 3 مدیریت بیدرنگ سیگنال
سیگنال های سنتی، همانطور که توسط POSIX 1003. 1 تعریف شده است، دارای محدودیت های متعددی هستند که آنها را برای برنامه های بلادرنگ نامناسب می کند:
سیگنال های تعریف شده توسط کاربر بسیار کم است.
هیچ اولویتی برای تحویل سیگنال وجود ندارد.
سیگنال های مسدود شده گم می شوند.
تحویل سیگنال حاوی اطلاعاتی نیست که سیگنال را از سایر انواع مشابه متمایز کند.
برای غلبه بر برخی از این محدودیتها، POSIX 1003. 1b عملکرد سیگنال POSIX 1003. 1 را گسترش میدهد تا تسهیلکنندههای زیر را برای سیگنالهای بلادرنگ شامل شود:
مثال 5-2 برخی اصلاحات را در مثال 5-1 نشان می دهد که به آن امکان می دهد سیگنال های بلادرنگ را با کارایی بیشتری پردازش کند.
مثال 5-2: ارسال یک سیگنال بلادرنگ به یک فرآیند دیگر
در این مثال:
بخشهای زیر افزونههای POSIX 1003. 1b را که در این مثال نشان داده شدهاند، شرح میدهند.
5. 3. 1 سیگنال های بیدرنگ اضافی
POSIX 1003. 1 تنها دو سیگنال را برای اهداف خاص برنامه مشخص کرد، SIGUSR1 و SIGUSR2. POSIX 1003. 1b محدوده ای از سیگنال های بیدرنگ را از SIGRTMIN تا SIGRTMAX تعریف می کند، که تعداد آنها توسط ثابت RTSIG_MAX در فایل هدر rt_limits. h (که در فایل هدر limits. h موجود است) تعیین می شود.
شما این سیگنال ها را (در sigaction و سایر توابع) با ارجاع به آنها از نظر SIGRTMIN یا SIGRTMAX مشخص می کنید: به عنوان مثال، SIGRTMIN+1 یا SIGRTMAX-1. مراقب باشید که SIGRTMIN و SIGRTMAX ثابت نیستند، بنابراین از اعلان های کامپایلری که از آنها استفاده می کنند اجتناب کنید. با فراخوانی sysconf(_SC_RTSIG_MAX) میتوانید تعداد سیگنالهای بیدرنگ روی سیستم را تعیین کنید.
اگرچه هیچ سفارش تحویل مشخصی برای سیگنالهای غیر POSIX 1003. 1b وجود ندارد، سیگنالهای بیدرنگ POSIX 1003. 1b از SIGRTMIN تا SIGRTMAX رتبهبندی میشوند (یعنی کمترین سیگنال بیدرنگ با شماره بالاترین اولویت را دارد). این به این معنی است که وقتی این سیگنالها مسدود شده و در حال تعلیق هستند، سیگنالهای SIGRTMIN ابتدا، سیگنالهای SIGRTMIN+1 تحویل داده میشوند و غیره. توجه داشته باشید که POSIX 1003. 1b هیچ ترتیب اولویتی را برای سیگنالهای غیرواقعی مشخص نمیکند، و همچنین ترتیب سیگنالهای بیدرنگ را نسبت به سیگنالهای غیرواقعی نشان نمیدهد.
اگر میخواهید تابعی فقط از این شمارههای سیگنال بلادرنگ جدید استفاده کند، میتوانید شمارههای سیگنال قدیمی POSIX 1003. 1 را در ماسکهای سیگنال فرآیند مسدود کنید.
5. 3. 2 سیگنال های صف به یک فرآیند
همانطور که در بخش 5. 2. 1 نشان داده شده است، ساختار sigaction که یک فرآیند بیدرنگ به تابع sigaction منتقل می شود دارای فرمت زیر است:
یک فرآیند با تنظیم پرچم SA_SIGINFO در عضو sa_flags این ساختار، رفتار سیگنالدهی بلادرنگ POSIX 1003. 1b (از جمله صف سیگنال و ارسال اطلاعات اضافی درباره سیگنال به کنترلکننده آن) را مشخص میکند. تنظیم بیت SA_SIGINFO دارای اثرات زیر است:
5. 3. 2. 1 ساختار siginfo_t
دومین آرگومان ارائه شده به کنترل کننده سیگنال یک ساختار siginfo_t است که اطلاعاتی را ارائه می دهد که فرستنده سیگنال و دلیل ارسال سیگنال را شناسایی می کند. ساختار siginfo_t در فایل هدر siginfo. h (شامل فایل هدر signal. h) به صورت زیر تعریف شده است:
لیست زیر اعضای ساختار siginfo_t را توصیف می کند:
عضو si_code اطلاعاتی را ارائه می دهد که منبع سیگنال را مشخص می کند. برای سیگنال های POSIX. 1b، می تواند حاوی یکی از مقادیر زیر باشد:
ارزش | شرح |
SI_ASYNCIO | سیگنال پس از تکمیل یک عملیات I/O ناهمزمان ارسال شد (به بخش 5. 3. 3 مراجعه کنید). |
SI_MESGQ | سیگنال هنگام ورود پیام به صف پیام خالی ارسال شد (به بخش 5. 3. 3 مراجعه کنید). |
si_queue | سیگنال توسط عملکرد Sigqueue ارسال شد. |
si_timer | سیگنال به دلیل انقضا تایمر ارسال شد (به بخش 5. 3. 3 مراجعه کنید). |
si_user | سیگنال با عملکرد کشتار یا عملکرد مشابهی مانند سقط یا افزایش ارسال شد. |
عضو Si_Value حاوی یک مقدار خاص برنامه است که در آخرین آرگومان به عملکرد Sigqueue که سیگنال را تولید می کند ، به کنترل کننده سیگنال منتقل شده است. بسته به اینکه آیا مقدار خاص برنامه یک عدد صحیح است یا یک اشاره گر ، عضو Si_Value می تواند حاوی هر یک از اعضای زیر باشد:
5. 3. 2. 2 ساختارهای ucontext_t و sigcontext
آرگومان سوم هنگامی که پرچم SA_SIGINFO در عضو SA_FLAGS ساختار SIGACTION مشخص شده توسط POSIX. 1B به عنوان یک آرگومان "اضافی" مشخص شده است ، به یک کنترل کننده سیگنال منتقل شد. سیستم عامل دیجیتال یونیکس از این قسمت برای انتقال یک ساختار ucontext_t به یک کنترل کننده سیگنال در یک محیط XPG4-Unix یا ساختار SIGContext در یک محیط BSD استفاده می کند.
هر دو ساختار حاوی زمینه فرآیند دریافت در زمان قطع شدن توسط سیگنال هستند. ساختار SigContext در پرونده هدر سیگنال. H تعریف شده است. ساختار ucontext_t در پرونده header ucontext. h تعریف شده است و به طور کامل در صفحه مرجع UContext (5) شرح داده شده است.
5. 3. 2. 3 ارسال سیگنال زمان واقعی با عملکرد Sigqueue
در جایی که یک فرآیند از تابع Kill برای ارسال یک سیگنال Nonrealtime به یک فرآیند دیگر استفاده می کند ، از عملکرد Sigqueue برای ارسال یک سیگنال زمان واقعی استفاده می کند. عملکرد Sigqueue شبیه به عملکرد کشتار است ، به جز اینکه یک آرگومان اضافی را ارائه می دهد ، یک مقدار سیگنال تعریف شده از برنامه که در عضو Si_Value از ساختار SIGINFO_T به کنترل کننده سیگنال منتقل می شود ، اگر فرآیند دریافت پرچم SA_SIGINFO را در عضو SA_FLAGS فعال کند. ساختار سیگنال سیگنال
عملکرد Sigqueue سیگنال مشخص شده را به فرآیند دریافت صف می کند. مجوزهای بررسی عملکرد Sigqueue همان مواردی است که در عملکرد کشتار اعمال می شود (بخش 5. 2 را ببینید). تماس گیرندگان غیر مجلل در تعداد سیگنالهایی که می توانند در هر زمان به طور فعال صف کنند محدود می شوند. این مقدار سهمیه برای هر فرآیند در پرونده هدر RT_LIMITS. H (که در پرونده هدر محدود شده است) به عنوان Sigqueue_Max تعریف شده و توسط مدیر سیستم قابل تنظیم است. می توانید با تماس با SysConf (_sc_sigqueue_max) مقدار آن را بازیابی کنید.
5. 3. 3 تحویل ناهمزمان دیگر سیگنال های زمان واقعی
علاوه بر ارائه عملکرد Sigqueue برای ارسال سیگنال های زمان واقعی به فرآیندها ، استاندارد POSIX 1003. 1B ویژگی های دیگری را تعریف می کند که باعث افزایش تولید سیگنال در زمان واقعی و تحویل به توابع می شود که نیاز به اعلان ناهمزمان دارند. توابع زمان واقعی ارائه شده است که به طور خودکار سیگنال های زمان واقعی را برای رویدادهای زیر تولید می کنند:
هنگام استفاده از کارکردهایی که باعث ایجاد این رویدادها می شوند ، برای ارائه سیگنال ها نیازی به تماس با یک تابع جداگانه ندارید. تحویل سیگنال زمان واقعی برای این رویدادها از یک ساختار سیگنوت استفاده می کند ، که به عنوان یک آرگومان (مستقیم یا غیرمستقیم) به تماس عملکرد مناسب ارائه می شود. ساختار sigevent حاوی اطلاعاتی است که سیگنال را توصیف می کند (یا به صورت آینده نگر ، مکانیسم دیگری از اعلان ناهمزمان مورد استفاده قرار می گیرد). در پرونده هدر سیگنال. H تعریف شده است و شامل اعضای زیر است:
عضو SIGEV_NOTIFY مکانیسم اعلان را برای استفاده در هنگام وقوع یک رویداد ناهمزمان مشخص می کند. دو مقدار برای SIGEV_NOTIFY در POSIX 1003. 1b وجود دارد:
ارزش | شرح |
sigev_signal | نشان می دهد که هنگام وقوع یک رویداد ، یک سیگنال صف با مقدار تعریف شده از برنامه تحویل داده می شود. |
sigev_none | نشان می دهد که در صورت بروز یک رویداد ، هیچ اعلان ناهمزمان ارائه نمی شود. |
اگر عضو SIGEV_NOTIFY حاوی SIGEV_SIGNAL باشد ، دو عضو دیگر ساختار Sigevent معنی دار هستند.
عضو SIGEV_VALUE یک مقدار تعریف شده از برنامه است که باید در زمان تحویل سیگنال به عملکرد صید سیگنال منتقل شود. این بسته به اینکه آیا مقدار خاص برنامه یک عدد صحیح یا یک اشاره گر است ، می تواند حاوی هر یک از اعضای زیر باشد:
عضو SIGEV_SIGNO شماره سیگنال را برای تکمیل عملکرد I/O ناهمزمان ، انقضا تایمر یا ارسال پیام به صف پیام مشخص می کند. برای هر یک از این رویدادها ، شما باید از عملکرد SIGAction برای تنظیم یک کنترل کننده سیگنال برای اجرای پس از دریافت سیگنال استفاده کنید. برای نمونه هایی از استفاده از سیگنال ها با این توابع به فصل 6 و فصل 7 مراجعه کنید.
5. 3. 4 پاسخ به سیگنال های زمان واقعی با استفاده از توابع Sigwaitinfo و Sigtimedwait
عملکرد SIGSUSPEND ، که در بخش 5. 2. 3 شرح داده شده است ، به یک فرآیند اجازه می دهد تا در حالی که منتظر تحویل سیگنال هستند ، مسدود شود. با ورود سیگنال ، کنترل کننده سیگنال فرآیند فراخوانی می شود. هنگامی که کنترل کننده ، تکمیل می شود ، روند انسداد می شود و اجرای آن را ادامه می دهد.
توابع SIGWAITINFO و SIGTIMEDWAIT ، تعریف شده در POSIX 1003. 1b ، همچنین به یک فرآیند اجازه می دهد تا انتظار تحویل سیگنال را مسدود کند. با این حال ، بر خلاف Sigsuspend ، آنها هنگام ورود سیگنال ، کنترل کننده سیگنال فرآیند را صدا نمی کنند. در عوض ، آنها بلافاصله روند را از بین می برند و تعداد سیگنال دریافت شده را به عنوان مقدار وضعیت باز می گردانند.
اولین آرگومان برای این توابع ، ماسک سیگنال است که مشخص می کند که این روند در انتظار کدام است. این روند باید سیگنال های مشخص شده در این ماسک را مسدود کرده باشد. در غیر این صورت ، آنها به هر کنترل کننده سیگنال مستقر اعزام می شوند. آرگومان دوم یک نشانگر اختیاری به مکانی است که عملکرد آن ساختار SIGINFO_T را که سیگنال را توصیف می کند ، برمی گرداند.
عملکرد SigtimedWait به شما امکان می دهد یک مقدار زمان بندی را مشخص کنید و به شما امکان می دهد محدودیتی را برای زمانی که فرآیند منتظر سیگنال است تعیین کنید.
مثال 5-3 نسخه ای از مثال 5-2 را نشان می دهد که کنترل کننده سیگنال را که هنگام فرآیند کودک یک سیگنال SIG_STOP_CHILD را از والدین خود دریافت می کند ، از بین می برد. در عوض ، فرآیند کودک سیگنال را مسدود می کند و عملکرد Sigwaitinfo را فراخوانی می کند تا منتظر تحویل آن باشد.
مثال 5-3: با استفاده از عملکرد Sigwaitinfo
در این مثال:
یک مثال اضافی با استفاده از عملکرد Sigwaitinfo در مثال 5-4 نشان داده شده است. در این مثال ، روند کودک حداکثر تعداد سیگنالهایی را که سیستم اجازه می دهد به والدین خود ارسال می کند. هنگامی که یک سیگنال SIG به آن تحویل داده می شود ، والدین آن را حساب می کنند و یک پیام آموزنده را چاپ می کنند. پس از دریافت سیگنال های _sc_sigqueue_max ، والدین پیامی را چاپ می کنند که تعداد سیگنال های دریافت شده را نشان می دهد.