2011-07-05 32 views
7

Microsoft đã phát an toàn ở đây. Trong bài viết của họ, "Creating a Child Process with Redirected Input and Output", họ đang nói:Tôi có phải đóng xử lý kế thừa sau này được sở hữu bởi quá trình con không?

Tay cầm mở còn lại sẽ được dọn sạch khi quá trình này kết thúc.
Để tránh rò rỉ tài nguyên trong một ứng dụng lớn hơn, hãy xử lý chặt chẽ một cách rõ ràng.

Điều này hoàn toàn vô dụng. Xử lý gì? Trong quá trình nào?


Tôi muốn làm quen với nó.

Khi xử lý được tạo trong quy trình gốc với SECURITY_ATTRIBUTES.bInheritHandle = TRUE, quy trình con có thể xem và sử dụng nó và tay cầm có cùng giá trị và quyền truy cập trong cả hai quy trình.

Nhưng nó có cùng xử lý hay là bản sao có cùng biểu diễn bằng số không?

Nếu tôi vượt qua hRead xử lý quy trình con để nó có thể đọc từ đường ống và quy trình con đóng tay cầm, tôi có cần phải đóng nó khỏi quy trình gốc không? Nó sẽ không lau ống từ dưới quá trình con?

Thử nghiệm của tôi cho thấy rằng CloseHandle trả về thành công khi cố gắng đóng một thanh công cụ hRead được chuyển cho trẻ sau khi trẻ đã đóng. Điều này lập luận mạnh mẽ cho Có, bạn nên đóng nó. Tuy nhiên, tôi sẽ đánh giá cao một lời khuyên vững chắc hơn ở đây.

Trả lời

10

Bạn chạm vào móng trên đầu ở đó. Win32 xử lý hoạt động như tham chiếu chế độ người dùng đến một đối tượng chế độ lõi cơ sở. Xử lý (tham chiếu) đối với các đối tượng mới và hiện có thường được tạo thông qua một số loại lệnh gọi CreateXXX - tham chiếu bổ sung có thể được tạo trong hiện tại hoặc các quy trình khác, bằng cách gọi DuplicateHandle - {hoặc đánh dấu xử lý là có thể kế thừa và tạo quy trình mới - sao chép một xử lý từ quá trình hiện tại vào quá trình con - đảm bảo rằng giá trị xử lý giống nhau.}

Tại thời điểm đó, có ít nhất hai tham chiếu đến đối tượng hạt nhân, cả hai cần phải đóng mở khóa đối tượng và giải phóng mọi tài nguyên được tiêu thụ.

+0

Ah. Vì vậy, xử lý * được nhân đôi khi tôi sinh ra một tiến trình con. Đó là những gì tôi đã sau. – GSerg

Các vấn đề liên quan