Banyak panggilan sistem akan melaporkan EINTR
kode kesalahan jika sinyal terjadi saat panggilan sistem sedang berlangsung. Sebenarnya tidak ada kesalahan yang terjadi, hanya dilaporkan seperti itu karena sistem tidak dapat melanjutkan panggilan sistem secara otomatis. Pola pengkodean ini hanya mencoba ulang panggilan sistem saat ini terjadi, untuk mengabaikan interupsi.
Misalnya, ini mungkin terjadi jika program menggunakan alarm()
untuk menjalankan beberapa kode secara asinkron saat penghitung waktu habis. Jika batas waktu terjadi saat program memanggil write()
, kami hanya ingin mencoba kembali panggilan sistem (alias baca/tulis, dll).
jawabannya di sini sangat bagus dan saya ingin menambahkan beberapa detail internal :
Panggilan sistem yang terganggu oleh sinyal dapat membatalkan dan mengembalikan
EINTR
atau secara otomatis restart sendiri jika dan hanya jikaSA_RESTART
ditentukan dalamsigaction(2)
dan yang bertanggung jawab untuk tugas ini adalah restart_block
yang digunakan untuk melacak informasi dan argumen untuk memulai kembali panggilan sistem
Dari halaman manual di write
:
Panggilan terputus oleh sinyal sebelum data apa pun ditulis