Rumah > tutorial komputer > pengetahuan komputer > Isyarat SIGPIPE Linux

Isyarat SIGPIPE Linux

王林
Lepaskan: 2024-02-19 16:00:33
ke hadapan
432 orang telah melayarinya

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.

Linux SIGPIPE信号

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

Label berkaitan:
sumber:mryunwei.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan