সিগন্যাল উপেক্ষা করা যেতে পারে (হারিয়ে)?


9

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা সংকেতগুলির মাধ্যমে কর্মীদের সাথে যোগাযোগ করছে (বিশিষ্ট SIGUSR1 / SIGUSR2 / SIGSTOP)।

আমি কি বিশ্বাস করতে পারি যে প্রতিটি সংকেত হ্যান্ডলার দ্বারা সরবরাহ করা হবে এবং প্রক্রিয়া করা হবে?

যদি সংকেতগুলি হ্যান্ডল করার জন্য অ্যাপ্লিকেশনটির পক্ষে সম্ভব না হয় তার চেয়ে দ্রুত পাঠানো হয় তবে কী ঘটে (উদাহরণস্বরূপ এই মুহুর্তে উচ্চ হোস্ট লোডের কারণে)?

উত্তর:


8

"অত্যধিক সংকেত" সমস্যাটি বাদ দিয়ে, সংকেতগুলি স্পষ্টভাবে উপেক্ষা করা যেতে পারে। থেকে man 2 signal:

If the signal signum is delivered to the process, then one of the
following happens:    
  *  If the disposition is set to SIG_IGN, then the signal is ignored.

সিগন্যালগুলিও অবরুদ্ধ করা যেতে পারে। থেকে man 7 signal;

A signal may be blocked, which means that it will not be delivered
until it is later unblocked.  Between the time when it is generated
and when it is delivered a signal is said to be pending.

সংকেতগুলির অবরুদ্ধ এবং উপেক্ষা উভয় সেটই শিশু প্রক্রিয়াগুলির দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত, সুতরাং এটি ঘটতে পারে যে আপনার আবেদনের মূল প্রক্রিয়া এই সংকেতগুলির মধ্যে একটিকে উপেক্ষা বা অবরুদ্ধ করেছে।

প্রক্রিয়াটি পূর্ববর্তীগুলি পরিচালনা করা শেষ করার আগে একাধিক সংকেত সরবরাহ করা হলে কী হবে? এটি ওএসের উপর নির্ভর করে। signal(2)র manpage এটা আলোচনা উপরে লিঙ্ক:

  • সিস্টেম ভি ভি সিগন্যাল স্বভাবকে ডিফল্টে পুনরায় সেট করবে। সবচেয়ে খারাপ, একাধিক সংকেতের দ্রুত বিতরণের ফলে পুনরাবৃত্তির (?) কল আসবে।
  • বিএসডি হ্যান্ডলারটি সম্পন্ন না হওয়া পর্যন্ত স্বয়ংক্রিয়ভাবে সিগন্যালটি আটকে দেবে।
  • লিনাক্সে, এটি জিএনইউতে সেট করা সংকলন পতাকাগুলির উপর নির্ভর করে libc, তবে আমি বিএসডি আচরণটি আশা করব।

4
লিনাক্সের ম্যান পৃষ্ঠাটি signal(2)জোর দিয়ে পরামর্শ দেয় যে sigaction(2)পরিবর্তে ব্যবহার করে আপনি এই বিভ্রান্তি এড়াতে পারেন ।
নেট এল্ডারেজ

7

আপনি বিশ্বাস করতে পারবেন না যে প্রেরিত প্রতিটি সংকেত সরবরাহ করা হবে। উদাহরণস্বরূপ, লিনাক্স কার্নেল "কোয়েলেসস" SIGCHLD যদি একটি প্রক্রিয়া একটি বহিরাগত শিশু প্রক্রিয়া থেকে SIGCHLD পরিচালনা করতে দীর্ঘ সময় নেয়।

আপনার প্রশ্নের অন্য অংশের উত্তর দেওয়ার জন্য, যদি সংখ্যার বিভিন্ন সংকেত খুব কম সময়ের ব্যবধানে আসে তবে সিগন্যালগুলি কার্নেলের ভিতরে "সারিযুক্ত" হয়ে যায়।

sigaction()আপনার sa_sigactionসদস্যের সাথে সিগন্যাল হ্যান্ডলার siginfo_tসেটআপ করার sa_maskজন্য, siginfo_tযুক্তির সদস্যকে সাবধানতার সাথে সেট করার জন্য আপনার ব্যবহার করা উচিত। আমি মনে করি এর অর্থ হ'ল কমপক্ষে "অ্যাসিঞ্চ" সংকেতগুলি সমস্তকেই ছড়িয়ে দেওয়া। লিনাক্সের ম্যান পেজ অনুসারে আপনি sigaction()পরিচালনা করা সংকেতটিও মুখোশ করুন। আমি মনে করি আপনার sa_flagsসদস্যটিকে SA_SIGINFO এ সেট করা উচিত , তবে আমার কেন এই কুসংস্কার আছে তা আমি মনে করতে পারি না। আমি বিশ্বাস করি এটি আপনার প্রক্রিয়াটি এমন একটি সিগন্যাল হ্যান্ডলার পাবেন যা কোনও রেসের শর্ত ছাড়াই স্থির থাকে এবং এমন একটি যা অন্যান্য সংকেতগুলির দ্বারা বাধাগ্রস্ত হয় না।

খুব খুব সাবধানে আপনার সিগন্যাল হ্যান্ডলার ফাংশন লিখুন। মূলত কেবল একটি বৈশ্বিক পরিবর্তনশীল সেট করুন যা একটি সিগন্যাল ধরা পড়েছে এবং সেই সংকেতের জন্য কাঙ্ক্ষিত ক্রিয়াকলাপের বাকী প্রক্রিয়া চুক্তি করে তা নির্ধারণ করুন। সিগন্যালগুলি সেই সময়টিতে কমপক্ষে সময়ের জন্য মুখোশ দেওয়া হবে।

এছাড়াও, আপনি আপনার সিগন্যাল হ্যান্ডলিং কোডটি খুব ভালভাবে পরীক্ষা করতে চাইবেন। এটি একটি ছোট পরীক্ষা প্রক্রিয়াতে রাখুন এবং যথাসম্ভব 2 বা 3 বিশেষ উদ্দেশ্যে সিগন্যাল-প্রেরণকারী প্রোগ্রামগুলি থেকে যতটা সম্ভব سگুসআর 1 এবং সিগুএসআর 2 সংকেত প্রেরণ করুন। আপনার কোডটি SIGUSR1 এবং SIGUSR2 দ্রুত এবং সঠিকভাবে পরিচালনা করতে পারে এমন বিশ্বাসী হওয়ার পরেও কিছু অন্যান্য সিগন্যালের সাথে মিশ্রিত করুন। নিজেকে ডিবাগিংয়ের জন্য প্রস্তুত করুন।

আপনি যদি লিনাক্স এবং কেবল লিনাক্স ব্যবহার করে থাকেন তবে আপনি signalfd()কোনও ফাইল বর্ণনাকারী তৈরি করতে ব্যবহার করার কথা ভাবতে পারেন যা আপনি select()এই সংকেতগুলি পাওয়ার জন্য পোল করতে পারেন। ব্যবহার signalfd()ডিবাগিংকে আরও সহজ করে তুলতে পারে।


2
এটি কেবল সিসিএলডিই নয় যা একত্রিত হয়ে যায়: সমস্ত সংকেতগুলি প্রক্রিয়াজাত হওয়ার আগে বিতরণ করা হলে তারা সম্ভাব্যভাবে একত্রিত হয়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

SIGCHLD সিগন্যালের জন্য কত দীর্ঘ "দীর্ঘ" এর কোনও পরিমাপ রয়েছে? আমি এখনই আমার প্রোগ্রামে এই আচরণটি অনুভব করছি, এবং আমার সিগন্যাল হ্যান্ডলার আমার হিসাব করা উচিত ~ 100ms এর বেশি নেয় না।
xrisk

@ রিশভ - আমার জ্ঞানের কাছে "খুব দীর্ঘ" কী তা জানার উপায় নেই। আমি আশা করব যে সামগ্রিক সিস্টেমের বোঝা গুরুত্বপূর্ণ। এটি হ'ল, অন্যান্য প্রক্রিয়াগুলি এবং কার্নেল কী করছে তা তাদের সংঘবদ্ধ হওয়ার জন্য সংকেতগুলির মধ্যে "কতক্ষণ" প্রভাবিত করবে। আমি সহায়ক মনে করি না think
ব্রুস এডিগার

6

একটি সংকেত সরবরাহ করার নিশ্চয়তা দেওয়া হয়, এই অর্থে যে কোনও প্রক্রিয়া যদি সফলভাবে কল করে kill, তারপরে লক্ষ্যটি সংকেতটি গ্রহণ করবে। এটি অ্যাসিঙ্ক্রোনাস: প্রেরকটির কখন সিগন্যাল পাওয়া বা প্রক্রিয়া করা হবে তা জানার কোনও উপায় নেই। তবে এটি গ্যারান্টি দেয় না যে সংকেত সরবরাহ করা হবে be লক্ষ্যটি সিগন্যাল প্রক্রিয়া করার আগেই মারা যেতে পারে। যদি লক্ষ্যটি সরবরাহের সময় সিগন্যালটিকে উপেক্ষা করে থাকে তবে সিগন্যালের কোনও প্রভাব থাকবে না। যদি লক্ষ্যটি একই সংকেত সংখ্যাটির প্রক্রিয়া করার আগে একাধিক উদাহরণ গ্রহণ করে, সিগন্যালগুলি (এবং সাধারণত হয়ে থাকে) একত্রী হতে পারে: আপনি যদি কোনও প্রসেসে দু'বার একই সংকেত প্রেরণ করেন তবে প্রক্রিয়াটি সংকেতটি গ্রহণ করবে কিনা তা আপনি জানতে পারবেন না you একবার অথবা দুইবার. সংকেতগুলি বেশিরভাগই একটি প্রক্রিয়া হত্যার জন্য তৈরি করা হয় বা প্রক্রিয়াটিকে মনোযোগ দেওয়ার উপায় হিসাবে তৈরি করা হয়, সেগুলি যোগাযোগের জন্য ডিজাইন করা হয়নি।

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


4
আপনি কীভাবে "সিগন্যালটি সরবরাহের নিশ্চয়তা রয়েছে" লেখার অর্থ বোঝাতে চেয়েছেন যেহেতু আপনি কয়েকটি উপায়ে যেভাবে সিগন্যালটি সরবরাহ করা হবে না (যেমন প্রক্রিয়াটি প্রাপ্ত হওয়ার আগেই মারা গিয়েছিল, বা সংকেতগুলি একত্রিত হয়েছিল)?
জনি

2

যদি একাধিক অবরুদ্ধ থাকে তবে কার্নেল স্ট্যান্ডার্ড সিগন্যালগুলিকে একত্রিত করতে মুক্ত a অন্যদিকে রিয়েল-টাইম সংকেতগুলি একইভাবে প্রতিবন্ধী নয়।

থেকে সংকেত (7) ম্যানুয়েল পৃষ্ঠা :

রিয়েল-টাইম সংকেতগুলি নিম্নলিখিত দ্বারা পৃথক করা হয়:

  1. রিয়েল-টাইম সিগন্যালের একাধিক উদাহরণ সারি করা যেতে পারে। বিপরীতে, যদি একটি সিগন্যালটি বর্তমানে অবরুদ্ধ অবস্থায় মানক সংকেতের একাধিক উদাহরণ সরবরাহ করা হয়, তবে কেবলমাত্র একটি উদাহরণ সারিযুক্ত।

SIGRTMIN থেকে SIGRTMAX পর্যন্ত পরিসরে একটি সংখ্যার সাথে একটি সংকেত ব্যবহার করার চেষ্টা করুন।


রিয়েল-টাইম সিগন্যালের জন্য একটি সীমা রয়েছে, তবে এটি বেশ উচ্চ। যদি ব্যবহারকারী দ্বারা প্রেরিত বকেয়া সংকেতগুলির সংখ্যা RLIMIT_SIGPENDING ছাড়িয়ে যায় তবে একটি সংকেত বাদ দেওয়া হবে। ulimit -iউবুন্টু 18.04 এ 63432 হিসাবে এই মানটি দেখায়।
বাইন করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.