Apakah Windows menangani penutupan soket saat proses keluar?
12
Saya sudah membaca pertanyaan ini tentang Linux, dapatkah sebuah port diikat ketika prosesnya telah dihentikan?
Linux muncul untuk membersihkan setelah proses keluar, dan meninggalkan soket terbuka. Saya bertanya-tanya apakah ada spesifikasi tentang cara kerjanya pada Windows. Apakah OS secara konsisten menjaga soket penutup untuk proses yang keluar tanpa menutupnya?
Menghentikan suatu proses memiliki hasil sebagai berikut:
[...]
Setiap sumber daya yang dialokasikan oleh proses dibebaskan.
Semua objek kernel ditutup.
[...]
Sementara pegangan terbuka ke objek kernel ditutup secara otomatis ketika proses berakhir, objek itu sendiri ada sampai semua pegangan terbuka untuk mereka ditutup. Oleh karena itu, objek akan tetap valid setelah proses yang menggunakannya berakhir jika proses lain memiliki pegangan terbuka untuk itu.
Semua aliran stdio terbuka (3) memerah dan tertutup.
_exit(2) - Manual Programmer Linux (kernel syscalls)
Fungsi ini _exit()menghentikan proses panggilan "segera". Deskriptor file terbuka yang termasuk dalam proses ditutup; anak-anak dari proses ini diwarisi oleh proses 1, init , dan orang tua proses dikirim sinyal SIGCHLD.
Perhatikan bahwa pada kedua sistem operasi,
Soket hanya satu jenis deskriptor file (fd) / objek kernel, jadi hal di atas berlaku sama untuk file dan soket.
Deskripsi file pada Unix, serta objek yang menangani objek kernel pada Windows, dapat dimiliki oleh beberapa proses - mereka menangani mereka dapat diwarisi oleh proses anak dan bahkan diteruskan menggunakan fungsi IPC khusus.
File atau soket hanya ditutup ketika semua fd yang menunjuk padanya dihancurkan.
Soket TCP adalah kasus khusus, karena status TIME_WAIT mereka. Misalnya, jika Anda menghentikan aplikasi yang mendengarkan pada port TCP, Anda seringkali tidak dapat langsung mengikat ke port yang sama.
haimg
2
Tidak. File deskriptor dan handle objek dimiliki dan dapat diakses hanya oleh satu proses, dan merupakan entitas per proses yang ketat . Ini adalah deskripsi file dan objek yang mendasari yang dibagikan di antara proses.
JdeBP
5
Pada Windows, soket adalah tautan antara titik akhir komunikasi dan suatu proses. Inilah sebabnya, ketika Anda menduplikasi soket, Anda berakhir dengan dua soket tetapi hanya satu titik akhir. Inilah sebabnya mengapa Anda tidak dapat melewatkan soket dari satu proses ke proses lainnya tanpa membuat soket baru di proses lainnya.
Jika proses tidak ada lagi, soketnya tidak ada lagi. Tidak ada konsep soket tanpa proses untuk menahannya. Inilah sebabnya mengapa pengandar kernel Windows yang ingin membuat soket di tingkat kernel harus menentukan proses untuk memiliki soket atau memanggil fungsi dari konteks proses yang dapat memiliki soket. (Atau mereka dapat memanipulasi titik akhir secara langsung tanpa menggunakan soket.)
Pertanyaan Anda tampaknya bukan tentang soket tetapi tentang titik akhir komunikasi itu sendiri. Soket memiliki referensi ke titik akhir komunikasinya. Ketika soket hilang, jumlah referensi turun. Jika mencapai nol, itu akan dihapus segera setelah diizinkan mengingat persyaratan protokol komunikasi yang dikaitkan dengan titik akhir. TCP memiliki status TIME_WAIT di mana titik akhir harus disimpan untuk menangani paket "sisa".
Tidak, belum. Sejak Windows NT versi 3. 5 , mungkin. Tapi DOS-Windows adalah binatang yang sangat berbeda dengan Windows NT ketika datang ke soket; dan DOS-Windows 95 berbeda dari DOS-Windows 3.1 secara signifikan. Aplikasi Win16 diminta untuk memanggil WSACleanup()jika tidak terjadi kebocoran; dan ada masalah buruk di DOS-Windows 9x, yang didokumentasikan dalam artikel MSKB # 156319, dengan proses induk yang membatalkan soket yang diberikan kepada anak-anak mereka, yang disebabkan oleh proses semantik keluar DOS-Windows yang agak berbeda untuk soket.
JdeBP
1
@ JdeBP: Bagaimana dengan Windows NT 3. 1 - apakah ia melakukan pembersihan otomatis?
user1686
1
3.1 tidak memiliki soket di tempat pertama.
JdeBP
... Poin bagus, @JdeBP - Saya tidak memikirkan itu.
user1686
@ JdeBP Jawaban yang diperbarui untuk memperbaikinya.
Pada Windows, soket adalah tautan antara titik akhir komunikasi dan suatu proses. Inilah sebabnya, ketika Anda menduplikasi soket, Anda berakhir dengan dua soket tetapi hanya satu titik akhir. Inilah sebabnya mengapa Anda tidak dapat melewatkan soket dari satu proses ke proses lainnya tanpa membuat soket baru di proses lainnya.
Jika proses tidak ada lagi, soketnya tidak ada lagi. Tidak ada konsep soket tanpa proses untuk menahannya. Inilah sebabnya mengapa pengandar kernel Windows yang ingin membuat soket di tingkat kernel harus menentukan proses untuk memiliki soket atau memanggil fungsi dari konteks proses yang dapat memiliki soket. (Atau mereka dapat memanipulasi titik akhir secara langsung tanpa menggunakan soket.)
Pertanyaan Anda tampaknya bukan tentang soket tetapi tentang titik akhir komunikasi itu sendiri. Soket memiliki referensi ke titik akhir komunikasinya. Ketika soket hilang, jumlah referensi turun. Jika mencapai nol, itu akan dihapus segera setelah diizinkan mengingat persyaratan protokol komunikasi yang dikaitkan dengan titik akhir. TCP memiliki status TIME_WAIT di mana titik akhir harus disimpan untuk menangani paket "sisa".
sumber
Ya itu. Telah cara ini merasakan windows
3.19598XP (Setidaknya saya tahu pasti sejak XP).sumber
WSACleanup()
jika tidak terjadi kebocoran; dan ada masalah buruk di DOS-Windows 9x, yang didokumentasikan dalam artikel MSKB # 156319, dengan proses induk yang membatalkan soket yang diberikan kepada anak-anak mereka, yang disebabkan oleh proses semantik keluar DOS-Windows yang agak berbeda untuk soket.