วิธีการฆ่าแต่ละด้ายภายใต้กระบวนการใน linux?


13

ป้อนคำอธิบายรูปภาพที่นี่

เหล่านี้เป็นเธรดแต่ละตัวของกระบวนการรับแพ็คเก็ต มีวิธีใดที่จะฆ่าเธรดเดี่ยว ๆ หรือไม่? Linux มีคำสั่งเฉพาะใด ๆ ที่สามารถฆ่าหรือส่งสัญญาณหยุดไปยังเธรดใด ๆ ภายใต้กระบวนการได้หรือไม่?


โปรแกรม Packet Reciever ของคุณคืออะไร (ฉันไม่มีในเดสก์ท็อป Debian ของฉัน) โปรดบอกเพิ่มเติมบางทีอาจมีลิงก์ ดังนั้นแก้ไขคำถามของคุณเพื่อปรับปรุง
Basile Starynkevitch

1
ฉันคิดว่าคุณไม่ทราบว่าสัญญาณ "หยุด" หยุดกระบวนการไม่ว่าคุณจะส่งเธรดใด
David Schwartz


1
@ Md.Kawsaruzzaman นั่นมันใช้งานไม่ได้ ตัวอย่างเช่นสมมติว่าเธรดอยู่ระหว่างการจัดสรรหน่วยความจำและล็อคการจัดสรรหน่วยความจำไว้ หากคุณหยุดเธรดแล้วจะไม่ปล่อยการล็อกและในที่สุดเธรดอื่นจะหยุดทำงานเช่นกัน ไม่ว่าคุณจะพยายามทำอะไรนี่ไม่ใช่วิธีที่จะทำ (อาจเป็นได้ว่าคุณต้องการหยุดงานที่ทำจากการทำด้าย แต่คุณต้องการความร่วมมือของกระบวนการในการทำเช่นนั้นถ้ามันไม่มีวิธีที่จะทำมันไม่สามารถทำได้)
เดวิด Schwartz

1
นอกจากนี้โปรดทราบว่าใน "ภาพหน้าจอของคุณ" ทุกเธรด "จะมี PID แยกต่างหาก ฉันไม่แน่ใจว่าคุณสามารถกำหนดเป้าหมายเธรดแยกกันได้เนื่องจากสัญญาณอาจถูกส่งไปยังกระบวนการเท่านั้น
szalski

คำตอบ:


16

โดยทั่วไปแล้วค่อนข้างอันตรายที่จะฆ่าแต่ละเธรดจากกระบวนการที่มีขนาดใหญ่กว่า หัวข้อนั้นอาจ:

  • ทำการแก้ไขบางสถานะที่แชร์กับเธรดอื่นที่อาจเสียหาย
  • ถือกุญแจบางส่วนที่ไม่ได้รับการปลดปล่อยทำให้ล็อคไม่สามารถใช้งานได้อย่างไม่มีกำหนด
  • ... หรือสิ่งอื่น ๆ ที่อาจทำให้เธรดอื่น ๆ ผิดพลาด

โดยทั่วไปแล้วนอกเหนือจากการจัดการและการซิงโครไนซ์โดยแอปพลิเคชันเองการฆ่าแต่ละเธรดไม่ใช่สิ่งที่เหมาะสม


5
สิ่งนี้ไม่มีประโยชน์เลย OP กำลังขอวิธีฆ่าเธรดไม่ใช่ว่าควรหรือไม่
Martin

สิ่งที่ฉันต้องการคือกระบวนการในการฆ่าหรือหยุดเธรดใด ๆ เพื่อวัตถุประสงค์บางอย่าง ฉันคิดว่าเนื่องจากข้อผิดพลาดบางครั้งผู้รับของเราจะถูกปิดโดยอัตโนมัติ เรากำลังค้นหาสาเหตุเนื่องจากโปรแกรมได้รับการพัฒนาโดย R&D ของเราเอง ตอนนี้สิ่งนี้อาจมีความเป็นไปได้ที่บางเธรดจะถูกปิดโดยอัตโนมัติ เราได้ทดสอบจากฝั่งโค้ดและทำให้เธรดลูกนั้นเป็นอิสระ แต่จากฝั่งเซิร์ฟเวอร์ยังคงทำให้เธรดบางครั้งหยุดทำงานซึ่งทำให้กระบวนการทั้งหมดต้องปิดตัวลงเช่นกัน
Md. Kawsaruzzaman

12

คุณอาจใช้tgkill (2)หรือtkillในโปรแกรม C (คุณจะต้องใช้syscall (2) ) แต่คุณไม่ต้องการที่จะ จากภายในโปรแกรมของคุณคุณสามารถใช้pthread_kill (3) - ซึ่งไม่ค่อยมีประโยชน์

(ฉันไม่ทราบแน่ชัดว่าเอฟเฟกต์จะมีtgkillหรือtkill- เช่นกับSIGKILLหรือSIGTERM- บนเธรด)

pthreads (7)สิ่งที่ห้องสมุดใช้ในระดับต่ำ (รวมทั้งบางส่วนของสัญญาณ (7) -s และfutex (7) -s ฯลฯ ... ดูยังnptl (7) ) และหากคุณดิบฆ่า (มีtkillหรือtgkill) บาง แต่ละเธรดกระบวนการของคุณจะอยู่ในสถานะที่ไม่ถูกต้อง ( พฤติกรรมที่ไม่ได้กำหนดไว้ ) เนื่องจากค่าคงที่ภายในบางอย่างจะใช้งานไม่ได้

ดังนั้นศึกษาเอกสารของโปรแกรมตัวรับแพ็คเก็ตของคุณและค้นหาวิธีอื่น หากเป็นซอฟต์แวร์เสรีศึกษารหัสต้นฉบับและปรับปรุง

อ่านอย่างระมัดระวังมากขึ้นสัญญาณ (7)และสัญญาณความปลอดภัย (7) สัญญาณหมายถึงการส่งไปยังกระบวนการ (โดยkill (2) ) และจัดการในเธรด

และในทางปฏิบัติสัญญาณและเธรดไม่ได้ดี อ่านบางpthread กวดวิชา

เคล็ดลับทั่วไปเมื่อเข้ารหัสโปรแกรมแบบมัลติเธรด (และต้องการจัดการสัญญาณภายนอกเช่นSIGTERM) คือใช้ไพพ์ (7)ในกระบวนการของคุณและโพล (2)ไพพ์นั้นในเธรดอื่น (คุณอาจพิจารณา Linux signalfdเฉพาะ(2) ) โดยมีตัวจัดการสัญญาณ(2) เขียนไบต์หรือบางส่วนลงในไพพ์นั้น เคล็ดลับที่รู้จักกันดีนั้นได้รับการอธิบายอย่างดีในเอกสารประกอบ Qt (และคุณสามารถใช้มันในโปรแกรมของคุณเองแม้ไม่มี Qt)


4
tgkillฟังก์ชั่นมีวิธีการบอกเลิกด้ายไม่มี ส่งสัญญาณไปยังเธรด มันมีชื่อว่า "kill" เพราะเป็นวิธีที่ผ่านมาเพื่อฆ่ากระบวนการและไม่สามารถใช้เพื่อฆ่าเธรดได้
David Schwartz

ฉันเดาว่าการส่งSIGKILLเธรดไปที่นั้นเป็นอันตรายต่อมัน หรือมันฆ่ากระบวนการทั้งหมดอยู่เสมอ? แล้วมันเกี่ยวกับSIGTERMอะไร? BTW แม้ว่าเธรดเท่านั้นที่จะได้รับอันตรายจุดของฉันคือกระบวนการอยู่ในสภาพที่น่ากลัว
Basile Starynkevitch

5
ใช่สัญญาณSIGKILLและSIGTERMมีการกำหนดเพื่อฆ่าหรือยุติกระบวนการ นั่นเป็นความจริงโดยไม่คำนึงว่าเธรดรับอะไร - พวกเขายังคงหมายถึงสิ่งเดียวกัน การยกเลิกเธรดโดยไม่ได้รับความร่วมมืออย่างใกล้ชิดของกระบวนการนั้นอาจเป็นเรื่องไร้สาระและเป็นหายนะต่อกระบวนการ
David Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.