বিভিন্ন সংকেত পাঠানোর কারণ কী?


28

প্রক্রিয়াটি পেতে পারে এমন সমস্ত সংকেত নিয়ে আমি মাঝে মাঝে কিছুটা বিভ্রান্ত হয়ে পড়ি। যেমনটি আমি এটি বুঝতে পারি, কোনও প্রক্রিয়াতে এই প্রতিটি সংকেতের জন্য একটি ডিফল্ট হ্যান্ডলার ( সংকেত স্বভাব ) থাকে তবে এটি কল করে এটির নিজস্ব হ্যান্ডলার সরবরাহ করতে পারে sigaction()

সুতরাং এখানে আমার প্রশ্ন: প্রতিটি সংকেত প্রেরণের কারণ কী? আমি বুঝতে পেরেছি যে আপনি -sপ্যারামিটারের মাধ্যমে চলমান প্রক্রিয়াগুলিতে ম্যানুয়ালি সিগন্যাল প্রেরণ করতে পারেন kill, তবে এই সংকেতগুলি কী প্রাকৃতিক পরিস্থিতিতে প্রেরণ করা হয়? উদাহরণস্বরূপ, কখন SIGINTপাঠানো হয়?

এছাড়াও, কোন সংকেতগুলি পরিচালনা করা যেতে পারে তার উপর কি কোনও বিধিনিষেধ রয়েছে? এমনকি SIGSEGVসিগন্যালগুলিও প্রক্রিয়া করা যায় এবং নিয়ন্ত্রণটিতে প্রয়োগে ফিরে যেতে পারে?


এর যথাযথ উত্তরটি মহাকাব্য হতে চলেছে, এবং মূলত এই বিষয়ে উইকিপিডিয়া নিবন্ধের তথ্যগুলি প্রতিলিপি করে , তাই আমি কেবল সেখানে উল্লেখ করব।
শন জে গফ

@ শাহন: উইকিপিডিয়া নিবন্ধে সিগন্যালের একটি তালিকা রয়েছে, তবে কে কী সংকেত প্রেরণ করে সে সম্পর্কে সুস্পষ্ট উপস্থাপনা নেই।
গিলস 23'8

উত্তর:


41

প্রসেসিং কলিংয়ের পাশাপাশি kill(2)কিছু পরিস্থিতিতে সিগন্যাল বিভিন্ন পরিস্থিতিতে কার্নেল (বা কখনও কখনও নিজেই প্রক্রিয়া দ্বারা) প্রেরণ করা হয়:

  • টার্মিনাল ড্রাইভাররা বিভিন্ন ইভেন্টের সাথে সংকেত প্রেরণ করে:
    • মূল প্রেস বিজ্ঞপ্তিগুলি: SIGINT(দয়া করে মূল লুপটিতে ফিরে যান) Ctrl+ C, SIGQUIT(দয়া করে অবিলম্বে প্রস্থান করুন) Ctrl+ \, SIGTSTP(দয়া করে স্থগিত করুন) Ctrl+ তে Zsttyকমান্ডের সাহায্যে কীগুলি পরিবর্তন করা যেতে পারে ।
    • SIGTTINএবং SIGTTOUপাঠানো হয় যখন কোনও পটভূমি প্রক্রিয়া তার নিয়ন্ত্রণকারী টার্মিনালটিতে পড়তে বা লিখতে চেষ্টা করে।
    • SIGWINCH টার্মিনাল উইন্ডোর আকার পরিবর্তন হয়েছে যে সিগন্যাল পাঠানো হয়।
    • SIGHUPটার্মিনালটি অদৃশ্য হয়ে গেছে এমন সিগন্যালে প্রেরণ করা হয়েছে ( icallyতিহাসিকভাবে কারণ আপনার মোডেমটি এইচ আপ হয়েছে , আজকাল সাধারণত আপনি টার্মিনাল এমুলেটর উইন্ডোটি বন্ধ করে দিয়েছেন বলে)।
  • কিছু প্রসেসরের ট্র্যাপ সংকেত তৈরি করতে পারে। বিশদটি আর্কিটেকচার এবং সিস্টেম নির্ভর; এখানে সাধারণ উদাহরণ রয়েছে:
    • SIGBUS একটি স্বাক্ষরবিহীন অ্যাক্সেস মেমরির জন্য;
    • SIGSEGV আনম্যাপযুক্ত পৃষ্ঠায় অ্যাক্সেসের জন্য;
    • SIGILL একটি অবৈধ নির্দেশের জন্য (খারাপ অপকোড);
    • SIGFPEখারাপ আর্গুমেন্ট (উদাঃ sqrt(-1)) সহ ভাসমান-পয়েন্ট নির্দেশের জন্য ।
  • বেশ কয়েকটি সংকেত লক্ষ্য প্রক্রিয়াটি সম্পর্কে জানায় যে কোনও সিস্টেমের ইভেন্ট ঘটেছে:
    • SIGALRMপ্রক্রিয়া দ্বারা নির্ধারিত একটি টাইমার মেয়াদ শেষ হয়ে গেছে তা সূচিত করে। টাইমার সঙ্গে সেট করা যেতে পারে alarm, setitimerএবং অন্যদের।
    • SIGCHLD এমন একটি প্রক্রিয়া সম্পর্কে জানায় যে এর একটি শিশু মারা গেছে।
    • SIGPIPEপড়ার শেষ বন্ধ হয়ে গেলে কোনও প্রক্রিয়া যখন পাইপে লেখার চেষ্টা করে তখন উত্পন্ন হয় (ধারণাটি হ'ল আপনি যদি চালনা করেন foo | barএবং barপ্রস্থান করেন তবে fooক দ্বারা নিহত হন SIGPIPE)।
    • SIGPOLL(এছাড়াও বলা হয় SIGIO) কোনও পরাতে সক্ষম ইভেন্টটি ঘটেছে এমন প্রক্রিয়াটি অবহিত করে। POSIX এর মাধ্যমে নিবন্ধিত পোল ইভেন্টগুলি নির্দিষ্ট করে I_SETSIG ioctl। অনেক সিস্টেমে O_ASYNC fcntlপতাকা মাধ্যমে নির্ধারিত কোনও ফাইল বর্ণনাকারীর মধ্যে পরাগযোগ্য ইভেন্টগুলিকে মঞ্জুরি দেয় । সম্পর্কিত সিগন্যালটি হ'ল SIGURG, যা কোনও ডিভাইসে (এর মাধ্যমে নিবন্ধিত I_SETSIG ioctl) বা সকেটের জরুরী ডেটা সম্পর্কে অবহিত করে ।
    • কিছু সিস্টেমে SIGPWRসমস্ত প্রক্রিয়ায় প্রেরণ করা হয় যখন ইউপিএস সংকেত দেয় যে পাওয়ার ব্যর্থতা আসন্ন।

এই তালিকা সম্পূর্ণ নয়। স্ট্যান্ডার্ড সংকেতগুলি সংজ্ঞায়িত করা হয় signal.h

বেশিরভাগ সংকেত অ্যাপ্লিকেশন দ্বারা ধরা এবং পরিচালনা করতে পারে (বা উপেক্ষা করা)। কেবল দুটি বহনযোগ্য সংকেত যা ধরা পড়তে পারে না সেগুলি হ'ল SIGKILL(সবেমাত্র মরা) এবং STOP(কার্যকর করা বন্ধ করুন)।

SIGSEGV( বিভাজন ত্রুটি ) এবং এর কাজিন SIGBUS( বাসের ত্রুটি ) ধরা যেতে পারে তবে আপনি কী করছেন তা যদি আপনি সত্যিই না জানেন তবে এটি একটি খারাপ ধারণা। তাদের ধরার জন্য একটি সাধারণ অ্যাপ্লিকেশন হ'ল স্ট্যাক ট্রেস বা অন্যান্য ডিবাগ তথ্য মুদ্রণ করা। আরও উন্নত অ্যাপ্লিকেশন হ'ল এক ধরণের ইন-প্রসেস মেমরি পরিচালনা বাস্তবায়ন করা বা ভার্চুয়াল মেশিন ইঞ্জিনগুলিতে খারাপ নির্দেশগুলি ফাঁদে ফেলা।

শেষ পর্যন্ত, আমি এমন কিছু উল্লেখ করব যা সংকেত নয়। আপনি যখন টার্মিনাল থেকে ইনপুট পড়ছেন এমন কোনও প্রোগ্রামের একটি লাইনের শুরুতে Ctrl+ টিপুন D, এটি প্রোগ্রামকে বলে যে ইনপুট ফাইলটির সমাপ্তি পৌঁছেছে। এটি কোনও সিগন্যাল নয়: এটি ইনপুট / আউটপুট এপিআইয়ের মাধ্যমে সঞ্চারিত। ভালো লেগেছে Ctrl+ + Cএবং বন্ধু, কী দিয়ে কনফিগার করা যেতে পারে stty


এবং সাইনআপ, আপনার মডেমটি স্তব্ধ হয়ে গেছে। :-)
কিথ

1
আরেকটি বিষয় লক্ষণীয়: SIGFPEকিছুটা অনিচ্ছাকৃতভাবেও শূন্যের দ্বারা পূর্ণসংখ্যা ভাগ এবং কখনও কখনও স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লোতেও সংকেত দেওয়া হয় ।
প্রথম দিন

18

প্রথমে আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য: SIGSTOPএবং SIGKILLঅ্যাপ্লিকেশনটি ধরা পড়তে পারে না, তবে প্রতিটি অন্যান্য সিগন্যাল এমনকি তা করতে পারে SIGSEGV। এই সম্পত্তিটি ডিবাগিংয়ের জন্য দরকারী - উদাহরণস্বরূপ, সঠিক লাইব্রেরির সহায়তায় আপনি SIGSEGVসেগফল্টটি কোথায় ঘটেছে তা দেখাতে আপনি শুনতে এবং একটি স্ট্যাক ব্যাকট্র্যাস তৈরি করতে পারেন ।

man 7 signalলিনাক্স কমান্ড লাইন থেকে টাইপ করে প্রতিটি সিগন্যাল কী করে তার আনুষ্ঠানিক শব্দ (লিনাক্সের জন্য, যাইহোক) available http://linux.die.net/man/7/signal তে একই তথ্য রয়েছে তবে টেবিলগুলি পড়া আরও শক্ত।

যাইহোক, সংকেতগুলির সাথে কিছু অভিজ্ঞতা ছাড়াই তারা অনুশীলনে কী করেন তা সংক্ষিপ্ত বিবরণ থেকে জানা শক্ত, সুতরাং এখানে আমার ব্যাখ্যাটি দেওয়া হল:

কীবোর্ড থেকে ট্রিগারড

  • SIGINTআপনি আঘাত যখন ঘটে CTRL+C
  • SIGQUITদ্বারা ট্রিগার করা হয় CTRL+\, এবং মূল ডাম্প।
  • SIGTSTPআপনি আঘাত করলে আপনার প্রোগ্রাম স্থগিত করে CTRL+Z। বিপরীতে SIGSTOP, এটি ক্যাচযোগ্য, যা প্রোগ্রামগুলি viতাদের স্থগিতের আগে টার্মিনালটিকে নিরাপদ অবস্থায় পুনরায় সেট করার সুযোগের মতো করে gives

টার্মিনাল ইন্টারঅ্যাকশন

  • SIGHUP ("হ্যাঙ্গআপ") হ'ল যা হয় যখন আপনি আপনার প্রোগ্রামটি চলাকালীন আপনার এক্সটার্ম বন্ধ করে দেন (বা অন্যথায় টার্মিনালটি সংযোগ বিচ্ছিন্ন করে)।
  • SIGTTINএবং SIGTTOUযদি আপনার প্রোগ্রামটি পটভূমিতে চলার সময় টার্মিনাল থেকে পড়ার বা লেখার চেষ্টা করে তবে এটি থামান। হওয়ার জন্য SIGTTOU, আমি মনে করি প্রোগ্রামটি /dev/ttyকেবলমাত্র ডিফল্ট স্টাডাউটকে নয়, লেখার দরকার ।

সিপিইউ ব্যতিক্রম দ্বারা ট্রিগারড

এর অর্থ আপনার প্রোগ্রামটি কিছু ভুল করার চেষ্টা করেছে।

  • SIGILLঅর্থ একটি অবৈধ বা অজানা প্রসেসরের নির্দেশ। আপনি যদি প্রসেসর I / O পোর্টগুলি সরাসরি অ্যাক্সেস করার চেষ্টা করেন তবে এটি ঘটতে পারে, উদাহরণস্বরূপ।
  • SIGFPEমানে একটি হার্ডওয়ার গণিতে ত্রুটি ছিল; সম্ভবত প্রোগ্রামটি শূন্য দ্বারা ভাগ করার চেষ্টা করেছিল।
  • SIGSEGV এর অর্থ আপনার প্রোগ্রামটি মেমরির একটি আনম্যাপযুক্ত অঞ্চল অ্যাক্সেস করার চেষ্টা করেছে।
  • SIGBUSমানে প্রোগ্রামটি অন্য কোনও উপায়ে ভুলভাবে মেমরি অ্যাক্সেস করেছে; আমি এই সংক্ষিপ্তসার বিশদে বিশদে যাব না।

প্রক্রিয়া মিথস্ক্রিয়া

  • SIGPIPEপাইপের পাঠক তাদের শেষ বন্ধ করার পরে যদি আপনি কোনও পাইপে লেখার চেষ্টা করেন তবেই ঘটে। দেখুন man 7 pipe
  • SIGCHLDযখন কোনও শিশু প্রক্রিয়া আপনি তৈরি করেন ত্যাগ করেন বা স্থগিত করা হয় (দ্বারা SIGSTOPবা অনুরূপ)।

স্ব-সংকেতের জন্য দরকারী

  • SIGABRTপ্রোগ্রামটি সাধারণত ফাংশনটিতে কল করার কারণে ঘটে থাকে এবং এটি abort()ডিফল্টরূপে একটি মূল ডাম্পের কারণ হয়। "প্যানিক বোতাম" বাছাই করুন।
  • SIGALRMalarm()সিস্টেম কল দ্বারা সৃষ্ট হয় , যার ফলে কার্নেলটি SIGALRMনির্দিষ্ট সেকেন্ডের পরে প্রোগ্রামে একটি সরবরাহ করতে পারে । দেখুন man 2 alarmএবং man 2 sleep
  • SIGUSR1এবং SIGUSR2প্রোগ্রামটি পছন্দ হলেও ব্যবহৃত হয়। প্রক্রিয়াগুলির মধ্যে সংকেত দেওয়ার জন্য তারা কার্যকর হতে পারে।

প্রশাসক প্রেরিত

এই সংকেত সাধারণত কম্যান্ড প্রম্প্ট থেকে পাঠানো হয় মাধ্যমে killকমান্ড বা fgবা bgক্ষেত্রে SIGCONT

  • SIGKILLএবং SIGSTOPঅবরুদ্ধযোগ্য সংকেতগুলি। প্রথম সর্বদা তাত্ক্ষণিকভাবে প্রক্রিয়াটি বন্ধ করে দেয়; দ্বিতীয়টি প্রক্রিয়া স্থগিত করে।
  • SIGCONT স্থগিত প্রক্রিয়া পুনরায় শুরু।
  • SIGTERMএর ক্যাচ করার যোগ্য সংস্করণ SIGKILL

shutdownকমান্ড ব্যবহার করা হলে কোন সংকেত প্রেরণ করা হয়?
নাথান ওসমান

এটি শাটডাউন স্ক্রিপ্টগুলির উপর নির্ভর করে। সাধারণত, SIGTERMপ্রথমে প্রেরণ করা হয়, তার পরে একটি বিলম্ব হয়, তারপরে অনুসরণ করা হয় SIGKILL। নীতিগতভাবে, একটি শক্ত, তাত্ক্ষণিক বন্ধের জন্য, কার্নেলকে কোনও সংকেত প্রেরণ করার দরকার নেই; এটি কেবল প্রক্রিয়া চালানো বন্ধ করতে পারে।
Jender
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.