আমি কিভাবে একটি প্রক্রিয়া একটি নির্দিষ্ট থ্রেড হত্যা করতে পারি?


21
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

এটি mypপিআইডি = 797 এবং বিভিন্ন এসপিআইডি সহ চারটি থ্রেড সহ প্রক্রিয়াটি দেখায় ।

পুরো প্রক্রিয়াটি না মেরে আমি কীভাবে প্রক্রিয়াটির একটি নির্দিষ্ট থ্রেডকে হত্যা করতে পারি। আমি বুঝতে পারি যে নির্দিষ্ট থ্রেডের জন্য মারাত্মক নির্ভরতা থাকলে কিছু ক্ষেত্রে এটি মোটেই সম্ভব না। তবে, এটি কি কোনও ক্ষেত্রেই সম্ভব? হ্যাঁ, কিভাবে?

আমি চেষ্টা করেছি kill 799এবং প্রক্রিয়াটি নিজেই সমাপ্ত হয়েছিল। এখন আমি নিশ্চিত নই যে এটি ছিল কারণ নির্ভরতা ছিল যে mypপ্রক্রিয়া ছাড়াই ব্যর্থ হয়েছিল 800বা হত্যার ফলে পৃথক প্রক্রিয়াগুলি মেরে ফেলা সহজ নয়।

উত্তর:


26

থ্রেডগুলি প্রক্রিয়াটির একটি অবিচ্ছেদ্য অঙ্গ এবং এর বাইরে হত্যা করা যায় না। নেই pthread_kill ফাংশন কিন্তু এটি শুধুমাত্র থ্রেড নিজেই প্রেক্ষাপটে প্রযোজ্য। লিঙ্কের ডক্স থেকে:

নোট করুন যে pthread_kill () কেবলমাত্র প্রদত্ত থ্রেডের প্রসঙ্গে সিগন্যালটি পরিচালনা করতে পারে; সিগন্যাল অ্যাকশন (সমাপ্তি বা থামানো) পুরো প্রক্রিয়াটিকে প্রভাবিত করে।


+1 টি। শুধু এখানে যোগ করতে। প্রক্রিয়াটির মধ্যে আপনি পৃথক থ্রেডে সংকেত প্রেরণের জন্য pthread_kill () ব্যবহার করতে পারেন। আপনি কিছু সংকেত হ্যান্ডলার যুক্ত করতে পারেন যা এটি করে।
হেমন্ত

@ ইহান্ত: ধরুন এমএস ওয়ার্ডটি বানান পরীক্ষার জন্য একটি পৃথক থ্রেড ব্যবহার করে। এই থ্রেডকে হত্যা করা পুরো জিনিসটিকে নীচে নামানো উচিত নয়, যদি না সেভাবে ডিজাইন করা হয়। এই জাতীয় পরিস্থিতিতে থ্রেড ছাড়া প্রক্রিয়া কেন বিদ্যমান থাকতে পারে না?
Lazer

1
ঠিক আছে, আমি মনে করি আপনি পিতামাতার প্রক্রিয়া থেকে আলাদা হয়ে থ্রেডিং মডেলটি ডিজাইন করতে পারতেন, তবে বাইরের প্রক্রিয়াগুলিকে আন্ত-প্রক্রিয়া থ্রেডগুলিকে মেরে ফেলার অনুমতি দেয় তবে এটি সুরক্ষা, প্রক্রিয়া পরিচালন এবং সিস্টেমের অখণ্ডতার সাথে কীটপতঙ্গ খোলে যা আমি করি না ' কোনও ভাবেন না যে কোনও সিস্টেম ডিজাইনার স্বেচ্ছায় নিজেকে জমা দেবে। এই ধরণের মাথা ব্যথা ছাড়াই থ্রেডিং যথেষ্ট শক্ত। ভিতরে থেকে থ্রেড মেরে ফেলা কোনও সমস্যা নয় কারণ কাজটি পিতামাতার প্রক্রিয়া দ্বারা সম্পন্ন হয় যা কোনও সমস্যা দেখা দিলে এবং তাকে হত্যা করা যেতে পারে - তবে স্বয়ংক্রিয়ভাবে বা অন্যথায় এটি দায়ী করা হয় responsible
gvkv

"যতক্ষণ না এটি সেভাবে ডিজাইন করা হয়েছে": থ্রেডগুলি ব্যবহারের মূল কারণটি হ'ল যাতে আপনি সংস্থানগুলি ভাগ করতে পারেন। এটি বরং অর্ধেক ঘর নক করার মতো।
pjc50

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

6

এই প্রশ্নের আধ্যাত্মিক উত্তর হ'ল: প্রক্রিয়াটির সহযোগিতায়, এটি যে কোনও প্রক্রিয়া সরবরাহ করে। প্রক্রিয়াটির সহযোগিতা ছাড়া এটি অসম্ভব। প্রক্রিয়াটি থ্রেড নিয়ে গঠিত প্রক্রিয়াটির অভ্যন্তরীণ বিবরণ যা ইচ্ছাকৃত নকশার দ্বারা প্রক্রিয়াটির বাইরে প্রকাশিত হয় না।


এবং কমান্ড লাইন থেকে অন্যান্য সংকেত প্রেরণ সম্পর্কে কি?
yucer

@ আইসর আমি নিশ্চিত না আপনি কী জিজ্ঞাসা করছেন আমি তা বুঝতে পেরেছি।
ডেভিড শোয়ার্জ

আমার অর্থ "কিল-এল" দেখানো তালিকা থেকে অন্য একটি সংকেত পাঠানো mean স্ট্যাকের ট্রেসটি কী করছে তা দেখার জন্য আমি কোনও নির্দিষ্ট থ্রেডকে আদেশ করার একটি উপায় অনুসন্ধান করছি।
yucer

@ আইসর এটি প্ল্যাটফর্ম-নির্দিষ্ট হতে চলেছে। কিছু স্ট্যাক ডাম্প করার জন্য একটি নির্দিষ্ট থ্রেডকে আদেশ করার উপায় সরবরাহ করে। ব্যক্তিগতভাবে, আমি gdbপ্রক্রিয়াটির সাথে একটি ডিবাগার (লাইক ) সংযুক্ত করার জন্য একটি স্ক্রিপ্ট ব্যবহার করা আরও সহজ বলেছি , সমস্ত থ্রেডকে স্ট্যাকটি ডাম্প করার নির্দেশ দিয়েছি এবং তারপরে আলাদা করতে পারি।
ডেভিড শোয়ার্টজ

1

@ Gkv এর উত্তরের উপরে আপনি ফাংশনটি দেখতে পারেন pthread_cancel(3), এর অংশ <pthread.h>। ম্যান পৃষ্ঠা থেকে:

Pthread_cancel () ফাংশন থ্রেড থ্রেডে বাতিলকরণের অনুরোধ পাঠায়। বাতিল হওয়ার অনুরোধে টার্গেট থ্রেড প্রতিক্রিয়া জানায় কিনা এবং কখন সেই থ্রেডের নিয়ন্ত্রণাধীন দুটি বৈশিষ্ট্যের উপর নির্ভর করে: এর বাতিলকরণের অবস্থা এবং প্রকার।


1

আপনি tgkill () দরকারী খুঁজে পেতে পারেন । ম্যান পৃষ্ঠার উল্লেখ হিসাবে এটি লিনাক্স নির্দিষ্ট।

tgkill () থ্রেড গ্রুপ টিজিডিতে থ্রেড আইডি টিডির সাহায্যে থ্রেডে সিগন্যাল সিগ প্রেরণ করে। (বিপরীতে, কিল (2) কেবলমাত্র একটি প্রক্রিয়াতে (যেমন, থ্রেড গ্রুপ) কেবল একটি সংকেত প্রেরণে ব্যবহার করা যেতে পারে এবং সেই প্রক্রিয়াটির মধ্যে সংকেতটি একটি স্বেচ্ছাসেবী থ্রেডে সরবরাহ করা হবে))


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