লিনাক্সের প্রক্রিয়ার অধীনে পৃথক থ্রেডটি কীভাবে হত্যা করা যায়?


13

এখানে চিত্র বর্ণনা লিখুন

এগুলি প্যাকেট রিসিভার প্রক্রিয়ার স্বতন্ত্র থ্রেড। কোনও পৃথক থ্রেড মারার কোনও উপায় আছে কি? লিনাক্স কি কোনও নির্দিষ্ট কমান্ড সরবরাহ করে যা কোনও প্রক্রিয়াটির অধীনে কোনও নির্দিষ্ট থ্রেডে হত্যা বা স্টপ সিগন্যাল প্রেরণ করতে পারে?


আপনার প্যাকেট রিসিভার প্রোগ্রামটি কী? (আমার ডেবিয়ান ডেস্কটপে এটি নেই) দয়া করে আরও বলুন, সম্ভবত কিছু লিঙ্ক সরবরাহ করুন। সুতরাং আপনার প্রশ্নটি উন্নত করতে সম্পাদনা করুন
বেসিল স্টারিঙ্কেভিচ

1
আমি মনে করি আপনি বুঝতে পারবেন না যে "থামা" সিগন্যাল কোনও প্রক্রিয়া থামিয়েছে, আপনি কোন থ্রেডে এটি পাঠিয়েছেন তা নির্বিশেষে।
ডেভিড শোয়ার্জ


1
@ মোঃ কাওসারুজ্জামান এটি ঠিক কাজ করবে না। ধরুন, উদাহরণস্বরূপ, থ্রেডটি বরাদ্দ মেমরির মাঝখানে এবং মেমরির বরাদ্দকারীকে লক ধরে। আপনি যদি থ্রেডটি বন্ধ করেন তবে তা কখনই লকটি প্রকাশ করবে না এবং শেষ পর্যন্ত অন্যান্য থ্রেডগুলিও বন্ধ হয়ে যাবে। আপনি যা যা করার চেষ্টা করছেন এটি এটি করার উপায় নয়। (এটি হতে পারে যে থ্রেডটি যে কাজটি করা হচ্ছে তা আপনি থামিয়ে দিতে চান But তবে এটি করার জন্য আপনার প্রক্রিয়াটির সহযোগিতা দরকার। এটি যদি এটি করার কোনও উপায় না দেয় তবে তা করা যায় না))
ডেভিড শোয়ার্জ

1
এছাড়াও মনে রাখবেন যে, আপনার স্ক্রিনশটে প্রতিটি "থ্রেড" এর আলাদা আলাদা পিআইডি থাকে। আমি নিশ্চিত নই যে আপনি পৃথক থ্রেডও লক্ষ্যবস্তু করতে পারেন, কারণ কেবল প্রক্রিয়াগুলিতে সংকেত পাঠানো যেতে পারে।
szalski

উত্তর:


16

বৃহত্তর প্রক্রিয়া থেকে স্বতন্ত্র থ্রেডকে হত্যা করা সাধারণত বেশ বিপজ্জনক। এই থ্রেড হতে পারে:

  • অন্যান্য থ্রেডগুলির সাথে কিছু ভাগ করা স্থিতি সংশোধন করুন যা দূষিত হয়ে উঠতে পারে
  • এমন কিছু লক ধরে রাখুন যা কখনই মুক্তি পায় না, যার ফলে লকটি অনির্দিষ্টকালের জন্য অনুপলব্ধ হয়ে যায়
  • ... বা অন্যান্য যে কোনও বিষয় যা অন্য থ্রেডগুলি ভুল হতে পারে।

সাধারণভাবে, নিজেই অ্যাপ্লিকেশন দ্বারা পরিচালনা এবং সিঙ্ক্রোনাইজেশনের বাইরে, পৃথক থ্রেডকে হত্যা করা বোঝার মতো কিছু নয়।


5
এটি মোটেই কার্যকর নয়। ওপি কীভাবে থ্রেড মারতে হবে তা জিজ্ঞাসা করছে , তাদের উচিত কিনা তা নয়।
মার্টিন

আমি যা চাই তা হ'ল প্রক্রিয়াটি হ'ল কোনও উদ্দেশ্যে কোনও নির্দিষ্ট থ্রেড মেরে বা থামানো। আমি ধরে নিয়েছি যে কিছু ত্রুটির কারণে, কখনও কখনও আমাদের রিসিভার স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়। প্রোগ্রামটি আমাদের নিজস্ব গবেষণা ও উন্নয়ন দ্বারা বিকাশিত হওয়ায় আমরা কারণগুলি সন্ধান করছি। এখন জিনিসটি এমন একটি সম্ভাবনা হতে পারে যে কিছু থ্রেড স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাচ্ছে। আমরা কোড সাইড থেকে পরীক্ষা করেছি এবং পেয়েছি যে চাইল্ড থ্রেডটি স্বতন্ত্র কিন্তু সার্ভার দিক থেকে এখনও কিছু থ্রেড বন্ধ হয়ে যায় যা মাঝে মাঝে সম্পূর্ণ প্রক্রিয়াটি বন্ধ করে দেয় ..
মোঃ কাওসারুজ্জামান

12

আপনি tgkill (2) বা tkillআপনার সি প্রোগ্রামে ব্যবহার করতে পারেন (আপনাকে সিস্কেল (2) ব্যবহার করতে হবে ) তবে আপনি চান না । আপনার প্রোগ্রামের অভ্যন্তর থেকে আপনি pthread_kill (3) ব্যবহার করতে পারেন - যা খুব কমই কার্যকর।

(আমি ঠিক জানি না কীভাবে প্রভাব ফেলবে tgkillবা tkill- যেমন থ্রেডের সাথে SIGKILLবা SIGTERM-

Pthreads (7) গ্রন্থাগার ব্যবহারের নিম্নস্তরের কাপড় (কিছু সহ সংকেত (7) -s এবং futex (7) -s ইত্যাদি ...; দেখুন NPTL- র (7) ) এবং যদি আপনি কাঁচা-নিহত (সঙ্গে tkillবা tgkill) কিছু স্বতন্ত্র থ্রেড, আপনার প্রক্রিয়াটি কিছু ভুল অবস্থায় থাকবে (তাই অপরিবর্তিত আচরণ ) কারণ কিছু অভ্যন্তরীণ আক্রমণকারী ভেঙে যাবে।

সুতরাং আপনার প্যাকেট রিসিভার প্রোগ্রামের ডকুমেন্টেশন অধ্যয়ন করুন এবং অন্য কোনও উপায় সন্ধান করুন। যদি এটি বিনামূল্যে সফ্টওয়্যার হয় তবে এর উত্স কোডটি অধ্যয়ন করুন এবং এটি উন্নত করুন।

আরও সাবধানে সিগন্যাল (7) এবং সংকেত-সুরক্ষা (7) পড়ুন । সংকেতগুলি প্রক্রিয়াগুলিতে প্রেরণ ( কিল (2) দ্বারা ) এবং থ্রেডগুলিতে পরিচালনা করা বোঝানো হয় ।

এবং অনুশীলনে, সংকেত এবং থ্রেডগুলি ভাল বিবাহ করে না। কিছু pthread টিউটোরিয়াল পড়ুন ।

একটি সাধারণ কৌশল, যখন একটি বহু-থ্রেড প্রোগ্রাম কোডিং করা হয় (এবং যেমন বহিরাগত সংকেতগুলি হ্যান্ডেল করতে চায় SIGTERM) তা হ'ল আপনার নিজস্ব প্রক্রিয়াতে একটি পাইপ (7) ব্যবহার করা এবং পোল (2) অন্য কোনও থ্রেডের পাইপ (আপনি লিনাক্স বিবেচনাও করতে পারেন) নির্দিষ্ট signalfd (2) ), একটি সংকেত হাতি সঙ্গে লেখ (2) একটি বাইট বা যে নল মধ্যে তাদের কয়েক -ing। সেই সুপরিচিত কৌশলটি কিউটি ডকুমেন্টেশনে ভালভাবে ব্যাখ্যা করা হয়েছে (এবং আপনি এটি নিজের প্রোগ্রামে এমনকি Qt ছাড়াই ব্যবহার করতে পারেন)।


4
tgkillফাংশন একটি থ্রেড বিনষ্ট করার কোনো উপায় প্রদান করে। এটি একটি থ্রেডে একটি সংকেত প্রেরণ করে। এটিকে "হত্যা" নামকরণ করা হয়েছে কারণ এটি কোনও প্রক্রিয়াটি মেরে ফেলার historicalতিহাসিক উপায় এবং এটি কোনও থ্রেড মেরে ব্যবহার করা যায় না।
ডেভিড শোয়ার্জ

আমার ধারণা যে SIGKILLকোনও থ্রেডে প্রেরণ এটির ক্ষতি করছে। নাকি সর্বদা পুরো প্রক্রিয়াটিকে হত্যা করছে? আর কি SIGTERM? বিটিডাব্লু, এমনকি যদি কেবল একটি থ্রেডের ক্ষতি করা হয় তবে আমার বক্তব্যটি প্রক্রিয়াটি ভয়াবহ অবস্থায় রয়েছে।
বেসাইল স্টারিনকিভিচ

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