เหล่านี้เป็นเธรดแต่ละตัวของกระบวนการรับแพ็คเก็ต มีวิธีใดที่จะฆ่าเธรดเดี่ยว ๆ หรือไม่? Linux มีคำสั่งเฉพาะใด ๆ ที่สามารถฆ่าหรือส่งสัญญาณหยุดไปยังเธรดใด ๆ ภายใต้กระบวนการได้หรือไม่?
เหล่านี้เป็นเธรดแต่ละตัวของกระบวนการรับแพ็คเก็ต มีวิธีใดที่จะฆ่าเธรดเดี่ยว ๆ หรือไม่? Linux มีคำสั่งเฉพาะใด ๆ ที่สามารถฆ่าหรือส่งสัญญาณหยุดไปยังเธรดใด ๆ ภายใต้กระบวนการได้หรือไม่?
คำตอบ:
โดยทั่วไปแล้วค่อนข้างอันตรายที่จะฆ่าแต่ละเธรดจากกระบวนการที่มีขนาดใหญ่กว่า หัวข้อนั้นอาจ:
โดยทั่วไปแล้วนอกเหนือจากการจัดการและการซิงโครไนซ์โดยแอปพลิเคชันเองการฆ่าแต่ละเธรดไม่ใช่สิ่งที่เหมาะสม
คุณอาจใช้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)
tgkill
ฟังก์ชั่นมีวิธีการบอกเลิกด้ายไม่มี ส่งสัญญาณไปยังเธรด มันมีชื่อว่า "kill" เพราะเป็นวิธีที่ผ่านมาเพื่อฆ่ากระบวนการและไม่สามารถใช้เพื่อฆ่าเธรดได้
SIGKILL
เธรดไปที่นั้นเป็นอันตรายต่อมัน หรือมันฆ่ากระบวนการทั้งหมดอยู่เสมอ? แล้วมันเกี่ยวกับSIGTERM
อะไร? BTW แม้ว่าเธรดเท่านั้นที่จะได้รับอันตรายจุดของฉันคือกระบวนการอยู่ในสภาพที่น่ากลัว
SIGKILL
และSIGTERM
มีการกำหนดเพื่อฆ่าหรือยุติกระบวนการ นั่นเป็นความจริงโดยไม่คำนึงว่าเธรดรับอะไร - พวกเขายังคงหมายถึงสิ่งเดียวกัน การยกเลิกเธรดโดยไม่ได้รับความร่วมมืออย่างใกล้ชิดของกระบวนการนั้นอาจเป็นเรื่องไร้สาระและเป็นหายนะต่อกระบวนการ