دوستان و علاقمندان به مباحث آموزش یونیکس (UNIX) ، این آموزش را از سایت پی وی لرن دنبال خواهیم نمود. Signal ها و Trap ها در یونیکس (UNIX) را در این بخش از آموزش مورد بررسی قرار خواهیم داد. با ما همراه باشید.
در این بخش، در مورد جزئیات Signal ها و Trap ها در یونیکس (UNIX) به تفصیل صحبت خواهیم کرد.
سیگنال ها (Signal) وقفه نرم افزاری هستند که به یک برنامه ارسال می شوند تا نشان دهند اتفاقی مهم رخ داده است. این رویدادها می توانند از درخواست های کاربر گرفته تا خطاهای دسترسی غیرقانونی حافظه، متفاوت باشند. برخی سیگنال ها ، مانند سیگنال قطع (interrupt)، نشان می دهد که کاربر از برنامه خواسته است کاری را انجام دهد که در جریان معمول کنترل قرار ندارد.
در جدول زیر سیگنال های متداولی که ممکن است با آن ها روبرو شوید و می توانید در برنامه های خود استفاده کنید آورده شده است.
نام سیگنال | شماره سیگنال | شرح |
---|---|---|
SIGHUP | ۱ | متوقف کردن تشخیص کنترل ترمینال یا مرگ فرآیند کنترل. |
SIGINT | ۲ | اگر کاربر سیگنال قطع (Ctrl + C) را ارسال کند صادر می شود. |
SIGQUIT | ۳ | در صورتی که کاربر سیگنال خروج (Ctrl + D) ارسال کند، صادر می شود. |
SIGFPE | ۸ | در صورت تلاش برای عملیات ریاضی غیر مجاز صادر می شود. |
SIGKILL | ۹ | در صورتی که یک فرآیند این سیگنال را دریافت کند ، باید فوراً خارج شود و هیچ عملیاتی برای پاکسازی انجام نمی دهد. |
SIGALRM | ۱۴ | Alarm clock signal (برای تایمر استفاده می شود) |
SIGTERM | ۱۵ | سیگنال خاتمه نرم افزار (ارسال شده توسط kill به طور پیش فرض) |
یک روش آسان برای لیست کردن تمام سیگنال های پشتیبانی شده توسط سیستم شما وجود دارد. تنها دستور kill -l را صادر کنید تا تمام سیگنال های پشتیبانی شده، نشان داده شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX |
لیست واقعی سیگنال ها بین Solaris ، HP-UX و Linux متفاوت است.
هر سیگنال یک عمل پیش فرض مرتبط با آن را دارا می باشد. عملکرد پیش فرض برای یک سیگنال عملی است که یک اسکریپت یا برنامه هنگام دریافت سیگنال انجام می دهد.
برخی از اقدامات پیش فرض ممکن است به شکل زیر باشند.
چندین روش برای ارسال سیگنال به یک برنامه یا اسکریپت وجود دارد. یکی از رایج ترین ها این است که کاربر در حین اجرای یک اسکریپت ، CONTROL-C یا کلید INTERRUPT را تایپ کند.
هنگامی که کلید Ctrl + C را فشار می دهید ، یک SIGINT به اسکریپت ارسال می شود و مطابق تنظیمات پیش فرض تعریف شده خاتمه می یابد.
روش متداول دیگر برای ارسال سیگنال استفاده از دستور kill است که سینتکس آن به شرح زیر است.
1 | $ kill -signal pid |
در این جا signal شماره یا نام سیگنال برای دیلیور است و pid فرایند ID است که سیگنال باید به آن فرستاده شود. برای مثال:
1 | $ kill -1 1001 |
دستور فوق سیگنال HUP یا سیگنال را برای برنامه ای که با فرایند ID 1001 در حال اجرا است متوقف می کند. برای ارسال سیگنال kill به همان فرآیند ، از دستور زیر استفاده کنید.
1 | $ kill -9 1001 |
این فرایند در حال اجرا را با ID 1001 می کشد.
مبحث Signal ها و Trap ها در یونیکس (UNIX) را ادامه می دهیم.
هنگامی که در زمان اجرای برنامه شل، کلید Ctrl + C یا کلید Break را در ترمینال خود فشار می دهید ، به طور معمول آن برنامه بلافاصله خاتمه می یابد و فرمان prompt شما برمی گردد. این ممکن است همیشه مطلوب نباشد.
به دام انداختن این سیگنال ها بسیار آسان است ، و دستور trap دارای سینتکس زیر می باشد.
1 | $ trap commands signals |
در این جا command هر دستور معتبری در یونیکس یا تابع تعریف شده توسط کاربر می تواند باشد، و signal می تواند لیستی از هر شماره از سیگنال هایی که شما می خواهید به دام بیندازید باشد.
دو استفاده ی معمول برای trap در شل اسکریپت ها وجود دارد.
به عنوان نمونه ای از دستور trap ، در زیر نشان می دهد که اگر کسی سعی کرد برنامه را از ترمینال قطع کند ، می توانید برخی از فایل ها را حذف کرده و سپس خارج شوید.
1 | $ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2 |
از آن جا که در برنامه shell که این trap اجرا شده است ، در صورت دریافت سیگنال شماره ۲ توسط برنامه ، دو فایل work1$$ و $$dataout به طور خودکار حذف می شود.
از این رو ، اگر کاربر بعد از اجرای این trap ، اجرای برنامه را قطع کند ، می توانید اطمینان داشته باشید که این دو فایل کلین آپ می شوند. فرمان خروجی که از rm پیروی می کند ضروری است زیرا بدون آن ، اجرا در برنامه در نقطه ای که، هنگام دریافت سیگنال قطع شده ، ادامه می یابد.
سیگنال شماره ۱ برای hangup تولید می شود. یا کسی عمدا خط را متوقف کرده یا خط به طور تصادفی قطع می شود.
می توانید trap قبلی را تغییر دهید تا با اضافه کردن سیگنال شماره ۱ به لیست سیگنال ها ، دو فایل مشخص در این حالت نیز حذف شود.
1 | $ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2 |
در صورت قطع شدن خط یا فشار دادن کلید Ctrl + C ، این فایل ها حذف می شوند.
در صورتي كه بيش از يك دستور باشد ، دستورات مشخص شده براي trap بايد به صورت نقل قول محصور شوند. همچنین توجه داشته باشید که شل در زمان اجرای فرمان trap و همچنین در هنگام دریافت یکی از سیگنال های ذکر شده ، خط فرمان را اسکن می کند.
بنابراین ، در مثال قبلی ، مقدار WORKDIR و $ $ در زمان اجرای دستور trap جایگزین می شوند. اگر می خواهید این تعویض در زمانی رخ دهد که سیگنال ۱ یا ۲ دریافت شده ، می توانید دستورات را به صورت تک نقل قول قرار دهید.
1 | $ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2 |
Signal ها و Trap ها در یونیکس (UNIX) را با مبحث نادیده گرفتن سیگنال ها ادامه می دهیم.
اگر دستور ذکر شده برای trap تهی (null) باشد ، سیگنال مشخص شده هنگام دریافت نادیده گرفته می شود. به عنوان مثال ، دستور زیر را بررسی نمایید.
1 | $ trap '' 2 |
این مشخص می کند که سیگنال قطع باید نادیده گرفته شود. ممکن است بخواهید هنگام انجام عملیاتی که نمی خواهید قطع شود ، سیگنال های خاصی را نادیده بگیرید. می توانید چندین سیگنال را مشخص کنید که به شرح زیر نادیده گرفته می شوند.
1 | $ trap '' 1 2 3 15 |
توجه داشته باشید که اولین آرگومان باید مشخص شود تا سیگنال نادیده گرفته شود و معادل نوشتن موارد زیر نیست ، که معنای جداگانه ای از خود دارند.
1 | $ trap 2 |
اگر سیگنالی را نادیده بگیرید ، همه زیر شل ها (subshells) نیز آن سیگنال را نادیده می گیرند. با این حال ، اگر اقدامی را برای دریافت سیگنال انجام دهید ، همه subshell ها هنوز در مورد دریافت آن سیگنال، اقدام پیش فرض را دریافت می کند.
بعد از این که اقدام پیش فرض مورد نیاز دریافت سیگنال را تغییر دادید ، اگر اولین آرگومان را حذف کنید ، می توانید دوباره آن را با trap تغییر دهید. بنابراین :
1 | $ trap 1 2 |
این اکشن را بازنشانی می کند برای دریافت سیگنال های ۱ یا ۲ به حالت پیش فرض.
مبحث Signal ها و Trap ها در یونیکس (UNIX) را در این بخش از آموزش مورد بررسی قرار دادیم. دوستان متشکریم از این که با دوره ی آموزش یونیکس همراه وب سایت پی وی لرن بودید. با سایر دوره های آموزشی ما نیز همراه باشید.