Dalam pihak komunikasi TCP, untuk kemudahan penerangan, pihak komunikasi digantikan dengan A dan B di bawah.
Mengikut protokol TCP, jika B terus menghantar data selepas A menutup sambungan, B akan menerima respons RST A. Jika B terus menghantar data, sistem akan menghantar isyarat SIGPIPE untuk memaklumkan bahawa sambungan telah diputuskan dan berhenti menghantar.
Tingkah laku pemprosesan lalai sistem untuk isyarat SIGPIPE adalah untuk membiarkan proses B keluar.
Tingkah laku pemprosesan lalai sistem pengendalian untuk isyarat SIGPIPE sangat tidak mesra, mari kita menganalisisnya.
Komunikasi TCP ialah saluran dupleks penuh, yang bersamaan dengan dua saluran simplex, dan setiap hujung sambungan bertanggungjawab untuk satu.
Apabila rakan sebaya "menutup", walaupun niatnya adalah untuk menutup keseluruhan dua saluran, hujung tempatan hanya menerima paket FIN.
Mengikut peruntukan protokol TCP, apabila satu hujung menutup saluran sehala yang bertanggungjawab, ia masih boleh menerima data tetapi tidak lagi menghantar data.
Dalam erti kata lain, disebabkan oleh batasan protokol TCP, pihak yang berkomunikasi tidak dapat mengetahui sama ada soket rakan sebaya telah memanggil tutup atau tutup.
int shutdown(int socket, int how);
Parameter "bagaimana" fungsi penutupan boleh ditetapkan untuk menutup SHUT_RD, SHUT_WR atau SHUT_RDWR, yang digunakan untuk menunjukkan penutupan saluran penerimaan dan penghantaran secara individu atau menutup saluran penghantaran dan penerimaan pada masa yang sama.
Panggil kaedah baca/recv pada soket yang telah menerima paket FIN Jika penimbal penerima kosong, 0 akan dikembalikan, yang sering dikatakan menandakan sambungan ditutup. Walau bagaimanapun, apabila kaedah tulis/hantar dipanggil buat kali pertama, jika tiada masalah dengan penimbal penghantaran, penulisan yang betul akan dikembalikan (iaitu, nilai pulangan fungsi tulis/hantar lebih besar daripada 0), tetapi mesej yang dihantar akan menyebabkan rakan sebaya bertindak balas dengan mesej RST. Kerana kali terakhir program dipanggil tulis/hantar, ia adalah perkara biasa Apabila cuba memanggil semula fungsi tulis/hantar, isyarat SIGPIPE dijana, menyebabkan proses keluar.
Tingkah laku lalai ini adalah untuk kami membangunkan program, terutamanya untuk perkhidmatan back-end, yang perlu melayani ramai pelanggan pada masa yang sama Keseluruhan proses tidak boleh keluar dan tidak boleh terus melayani pelanggan lain kerana terdapat masalah dengan sambungan ke pelanggan tertentu.
Untuk mengelakkan fenomena ini, anda boleh menangkap isyarat SIGPIPE dan memprosesnya atau mengabaikan isyarat tersebut Kod untuk mengabaikan isyarat adalah seperti berikut:
signal(SIGPIPE, SIG_IGN);
Selepas menetapkan seperti ini, apabila kaedah tulis/hantar dipanggil untuk kali kedua, -1 akan dikembalikan, dan kod ralat errno akan ditetapkan kepada SIGPIPE, jadi program akan mengetahui bahawa rakan sebaya telah ditutup.
Atas ialah kandungan terperinci Isyarat SIGPIPE Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!