Windows có đảm nhiệm việc đóng các socket khi các tiến trình thoát không?


12

Tôi đã đọc câu hỏi này về Linux, một cổng có thể bị ràng buộc khi quá trình kết thúc không?
Linux dường như dọn dẹp sau khi thoát khỏi quá trình và để lại các ổ cắm mở. Tôi đã tự hỏi nếu có bất kỳ đặc điểm kỹ thuật về cách thức này hoạt động trên Windows. Hệ điều hành có luôn đảm bảo việc đóng các socket cho các tiến trình thoát mà không đóng chúng không?

Câu trả lời:


10

Trên cả Windows và Unixen, khi một tiến trình thoát ra, nhân sẽ đóng tất cả các thẻ điều khiển mở.

Windows NT

Chấm dứt một quá trình - MSDN

Chấm dứt một quá trình có kết quả như sau:

  • [...]
  • Bất kỳ tài nguyên được phân bổ bởi quá trình được giải phóng.
  • Tất cả các đối tượng kernel được đóng lại.
  • [...]

Trong khi các điều khiển mở cho các đối tượng kernel được đóng tự động khi một quá trình kết thúc, các đối tượng tự tồn tại cho đến khi tất cả các điều khiển mở đối với chúng được đóng lại. Do đó, một đối tượng sẽ vẫn còn hiệu lực sau khi một quy trình đang sử dụng nó chấm dứt nếu một quy trình khác có xử lý mở đối với nó.

ExitProcesschức năng - MSDN

Thoát khỏi một quá trình gây ra những điều sau đây:

  • [...]
  • Tất cả các tay cầm đối tượng được mở bởi quá trình được đóng lại.
  • [...]

Linux

exit(3) - Hướng dẫn lập trình Linux (chức năng libc)

Tất cả các luồng stdio (3) mở được tuôn ra và đóng lại.

_exit(2) - Hướng dẫn lập trình Linux (tòa nhà nhân)

Chức năng _exit()chấm dứt quá trình gọi "ngay lập tức". Bất kỳ mô tả tập tin mở thuộc quá trình được đóng lại; bất kỳ con nào của tiến trình đều được kế thừa bởi tiến trình 1, init và cha mẹ của tiến trình được gửi tín hiệu SIGCHLD.


Lưu ý rằng trên cả hai hệ điều hành,

  1. Các socket chỉ là một loại mô tả tập tin (fd's) / các đối tượng kernel, do đó, các điều trên áp dụng như nhau cho các tập tin và socket.

  2. Mô tả tệp trên Unix, cũng như đối tượng xử lý các đối tượng kernel trên Windows, có thể được sở hữu bởi nhiều quy trình - chúng xử lý chúng có thể được kế thừa bởi các tiến trình con và thậm chí được chuyển qua sử dụng các hàm IPC đặc biệt.

  3. Một tệp hoặc ổ cắm chỉ được đóng khi tất cả các fd trỏ đến nó bị hủy.


2
Ổ cắm TCP là một trường hợp đặc biệt, vì trạng thái TIME_WAIT của chúng. Ví dụ: nếu bạn chấm dứt một ứng dụng nghe trên cổng TCP, bạn thường không thể liên kết với cùng một cổng ngay lập tức.
haimg

2
Không. Bộ mô tảxử lý đối tượng được sở hữu và chỉ có thể truy cập đối với một quy trình và là các thực thể theo quy trình . Đó là mô tả tệp và đối tượng cơ bản được chia sẻ giữa các quy trình.
JdeBP

5

Trên Windows, ổ cắm là một liên kết giữa điểm cuối truyền thông và quy trình. Đây là lý do tại sao, khi bạn nhân đôi một ổ cắm, bạn kết thúc với hai ổ cắm nhưng chỉ có một điểm cuối. Đây là lý do tại sao bạn không thể chuyển một ổ cắm từ quy trình này sang quy trình khác mà không tạo ra một ổ cắm mới trong quy trình khác.

Nếu quá trình không còn tồn tại, ổ cắm của nó nhất thiết phải ngừng tồn tại. Không có khái niệm về một ổ cắm mà không có một quá trình để giữ nó. Đây là lý do tại sao ngay cả các trình điều khiển hạt nhân Windows muốn tạo ổ cắm ở cấp kernel phải chỉ định một quy trình để sở hữu ổ cắm hoặc gọi hàm từ ngữ cảnh quy trình có thể sở hữu ổ cắm. (Hoặc họ có thể thao tác trực tiếp các điểm cuối mà không cần sử dụng ổ cắm.)

Câu hỏi của bạn dường như thực sự không phải về ổ cắm mà là về các điểm cuối giao tiếp. Một ổ cắm có một tham chiếu đến điểm cuối giao tiếp của nó. Khi ổ cắm biến mất, số tham chiếu giảm xuống. Nếu nó về 0, nó sẽ bị xóa ngay khi được cho phép theo các yêu cầu của giao thức truyền thông mà điểm cuối được liên kết. TCP có trạng thái TIME_WAIT trong đó điểm cuối phải được giữ xung quanh để xử lý mọi gói "còn sót lại".


3

Có nó làm. Nó đã được hiểu theo cách này của windows 3.1 95 98 XP (Ít nhất là tôi biết chắc chắn từ XP).


1
Không, nó không có. Kể từ Windows NT phiên bản 3. 5 , có lẽ. Nhưng DOS-Windows là một động vật rất khác với Windows NT khi nói đến ổ cắm; và DOS-Windows 95 khác với DOS-Windows 3.1, hơn nữa. Các ứng dụng Win16 được yêu cầu gọi WSACleanup()nếu không có rò rỉ xảy ra; và có một vấn đề khó chịu trong DOS-Windows 9x, được ghi lại trong bài viết MSKB # 156319, với các quy trình cha mẹ vô hiệu hóa các ổ cắm được truyền cho con cái của chúng, do ngữ nghĩa thoát quy trình khác nhau của DOS-Windows gây ra cho các ổ cắm.
JdeBP

1
@JdeBP: Thế còn Windows NT 3. 1 - nó có thực hiện dọn dẹp tự động không?
dùng1686

1
3.1 không có ổ cắm ở nơi đầu tiên.
JdeBP

... Điểm hay, @JdeBP - Tôi không nghĩ về điều đó.
dùng1686

@JdeBP Cập nhật câu trả lời để sửa nó.
Scott Chamberlain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.