Windows ดูแลซ็อกเก็ตปิดหรือไม่เมื่อกระบวนการออก


12

ฉันได้อ่านคำถามเกี่ยวกับลินุกซ์, พอร์ตสามารถถูกผูกไว้เมื่อกระบวนการสิ้นสุดลง?
Linux ดูเหมือนจะล้างข้อมูลหลังจากกระบวนการออกจากและออกจากซ็อกเก็ตที่เปิดอยู่ ฉันสงสัยว่ามีข้อกำหนดใด ๆ เกี่ยวกับการทำงานบน Windows หรือไม่ ระบบปฏิบัติการจะคอยดูแลซ็อกเก็ตปิดสำหรับกระบวนการที่ออกโดยไม่ปิดอย่างสม่ำเสมอหรือไม่?

คำตอบ:


10

บนทั้ง Windows และ Unixen เมื่อกระบวนการออกจากเคอร์เนลปิดหมายเลขอ้างอิงที่เปิดทั้งหมด

วินโดวส์เอ็นที

การยุติกระบวนการ - MSDN

การยุติกระบวนการมีผลลัพธ์ดังต่อไปนี้:

  • [ ... ]
  • ทรัพยากรใด ๆ ที่จัดสรรโดยกระบวนการนั้นจะถูกทำให้เป็นอิสระ
  • เคอร์เนลวัตถุทั้งหมดถูกปิด
  • [ ... ]

ในขณะที่การจัดการเปิดไปยังวัตถุเคอร์เนลจะถูกปิดโดยอัตโนมัติเมื่อกระบวนการสิ้นสุดลงวัตถุเหล่านั้นจะมีอยู่จนกว่าการจัดการที่เปิดทั้งหมดจะถูกปิด ดังนั้นวัตถุจะยังคงใช้ได้หลังจากกระบวนการที่ใช้มันสิ้นสุดลงหากกระบวนการอื่นมีหมายเลขอ้างอิงที่เปิดอยู่

ExitProcessฟังก์ชั่น - MSDN

การออกจากกระบวนการทำให้เกิดสิ่งต่อไปนี้:

  • [ ... ]
  • การจัดการวัตถุที่เปิดโดยกระบวนการทั้งหมดจะถูกปิด
  • [ ... ]

ลินุกซ์

exit(3) - คู่มือโปรแกรมเมอร์ Linux (ฟังก์ชั่น libc)

สตรีมstdio (3) ที่เปิดอยู่ทั้งหมดจะถูกล้างและปิด

_exit(2) - คู่มือโปรแกรมเมอร์ Linux (เคอร์เนล syscalls)

ฟังก์ชั่น_exit()ยุติกระบวนการเรียก "ทันที" ตัวอธิบายไฟล์แบบเปิดใด ๆ ที่เป็นของกระบวนการจะถูกปิด ลูก ๆ ของกระบวนการได้รับการสืบทอดโดยกระบวนการ 1 เริ่มต้นและผู้ปกครองของกระบวนการจะส่งสัญญาณ SIGCHLD


โปรดทราบว่าในระบบปฏิบัติการทั้งสอง

  1. ซ็อกเก็ตเป็นหนึ่งในประเภทของ file descriptors (fd's) / เคอร์เนลวัตถุดังนั้นด้านบนใช้กับไฟล์และซ็อกเก็ตอย่างเท่าเทียมกัน

  2. คำอธิบายไฟล์บน Unix เช่นเดียวกับวัตถุที่จัดการกับเคอร์เนลวัตถุใน Windows สามารถเป็นเจ้าของได้หลายกระบวนการ - พวกเขาจัดการสามารถสืบทอดโดยกระบวนการเด็กและแม้กระทั่งผ่านรอบโดยใช้ฟังก์ชั่นพิเศษ IPC

  3. ไฟล์หรือซ็อกเก็ตจะปิดเฉพาะเมื่อfd ทั้งหมดชี้ไปที่มันจะถูกทำลาย


2
ซ็อกเก็ต TCP เป็นกรณีพิเศษเนื่องจากสถานะ TIME_WAIT ของพวกเขา เช่นหากคุณยกเลิกแอปพลิเคชั่นที่ฟังพอร์ต TCP คุณมักจะไม่สามารถผูกกับพอร์ตเดียวกันได้ทันที
haimg

2
ไม่ตัวอธิบายไฟล์และตัวจัดการวัตถุนั้นเป็นของและสามารถเข้าถึงได้เพียงหนึ่งกระบวนการเท่านั้นและเป็นเอนทิตีต่อกระบวนการอย่างเคร่งครัด มันเป็นคำอธิบายไฟล์และวัตถุพื้นฐานที่ใช้ร่วมกันระหว่างกระบวนการ
JdeBP

5

บน Windows ซ็อกเก็ตคือลิงก์ระหว่างจุดปลายการสื่อสารและกระบวนการ นี่คือเหตุผลที่เมื่อคุณทำซ้ำซ็อกเก็ตคุณจะจบลงด้วยซ็อกเก็ตสองซ็อกเก็ต แต่ปลายทางเดียวเท่านั้น นี่คือเหตุผลที่คุณไม่สามารถผ่านซ็อกเก็ตจากกระบวนการหนึ่งไปยังกระบวนการอื่นโดยไม่ต้องสร้างซ็อกเก็ตใหม่ในกระบวนการอื่น

หากกระบวนการสิ้นสุดลงแล้วซ็อกเก็ตของมันจำเป็นต้องหยุดอยู่ ไม่มีแนวคิดของซ็อกเก็ตโดยไม่มีกระบวนการที่จะถือมัน นี่คือสาเหตุที่แม้แต่ไดรเวอร์เคอร์เนลของ Windows ที่ต้องการสร้างซ็อกเก็ตในระดับเคอร์เนลต้องระบุกระบวนการเพื่อให้เป็นเจ้าของซ็อกเก็ตหรือเรียกใช้ฟังก์ชันจากบริบทกระบวนการซึ่งสามารถเป็นเจ้าของซ็อกเก็ตได้ (หรือพวกเขาสามารถจัดการจุดปลายได้โดยตรงโดยไม่ต้องใช้ซ็อกเก็ต)

คำถามของคุณดูเหมือนจะไม่เกี่ยวกับซ็อกเก็ต แต่เกี่ยวกับจุดสิ้นสุดการสื่อสารด้วยตนเอง ซ็อกเก็ตมีการอ้างอิงถึงจุดสิ้นสุดการสื่อสาร เมื่อซ็อกเก็ตหายไปจำนวนการอ้างอิงจะลดลง หากพบศูนย์มันจะถูกลบทันทีที่ได้รับอนุญาตตามข้อกำหนดของโปรโตคอลการสื่อสารที่เกี่ยวข้องกับปลายทาง TCP มีสถานะ TIME_WAIT ในระหว่างที่ปลายทางต้องเก็บไว้รอบ ๆ เพื่อจัดการกับแพ็คเก็ต "ที่เหลือ"


3

ใช่. จะได้รับความรู้สึกแบบนี้หน้าต่าง3.1 95 98 XP (อย่างน้อยผมทราบว่าตั้งแต่ XP)


1
ไม่เลย ตั้งแต่ Windows NTเวอร์ชัน 3 5อาจจะเป็น แต่ดอส - วินโดวส์เป็นสัตว์ที่แตกต่างจาก Windows NT มากเมื่อเทียบกับซ็อกเก็ต และ DOS-Windows 95 แตกต่างจาก DOS-Windows 3.1 อย่างมีนัยสำคัญนอกจากนี้ ต้องใช้แอปพลิเคชั่น Win16 เพื่อเรียกการWSACleanup()รั่วไหลมิฉะนั้นจะเกิดขึ้น และมีปัญหาที่น่ารังเกียจใน DOS-Windows 9x ที่บันทึกไว้ในบทความ MSKB # 156319 พร้อมกับกระบวนการหลักที่ทำให้ซ็อกเก็ตทำให้การตรวจสอบซ็อกเก็ตผ่านไปยังลูก ๆ ของพวกเขาซึ่งเกิดจากความหมายของ
JdeBP

1
@JdeBP: แล้ว Windows NT 3 1 - มันทำการล้างข้อมูลอัตโนมัติหรือไม่?
user1686

1
3.1 ไม่มีช่องเสียบในตอนแรก
JdeBP

... ประเด็นดี @JdeBP - ฉันไม่คิดอย่างนั้น
user1686

@JdeBP อัปเดตคำตอบเพื่อแก้ไข
Scott Chamberlain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.