Adam sayfalarını okumasını read()
ve write()
çağrılar çağrılar olursa olsun engellemek veya olmasın zorunda olup sinyalleri tarafından kesintiye olsun anlaşılmaktadır.
Özellikle, varsayalım
- Bir işlem, bazı sinyaller için bir işleyici kurar.
- bir cihazın (diyelim ki bir terminal) açılır
O_NONBLOCK
olmayan set (yani engelleme modunda işletme) - işlem daha sonra
read()
cihazdan okumak için bir sistem çağrısı yapar ve sonuç olarak çekirdek uzayında bir çekirdek kontrol yolu yürütür. - Öncelik
read()
çekirdek alanında yürütülürken işleyicinin daha önce kurulduğu sinyal bu işleme iletilir ve sinyal işleyicisi çağrılır.
SUSv3 'Sistem Arayüzleri hacmi (XSH)' içindeki man sayfalarını ve uygun bölümleri okumak , şunu bulur:
ben. A read()
herhangi bir veriyi okumadan önce bir sinyal tarafından kesilirse (yani, veri mevcut olmadığından bloke etmek zorunda kaldıysa ), errno
[EINTR] olarak ayarlanmış olarak -1 değerini döndürür .
ii. A read()
bazı verileri başarıyla okuduktan sonra bir sinyal tarafından kesilirse (yani isteği hemen yerine getirmek mümkün oldu), okunan bayt sayısını döndürür.
Soru A):
Her iki durumda da (blok yok / blok yok) sinyalin teslimatı ve kullanımının tamamen şeffaf olmadığı varsayımı doğru muyum read()
?
Dava i. bloke etme read()
işlemi normalde duruma yerleştirir, TASK_INTERRUPTIBLE
çünkü bir sinyal iletildiğinde, çekirdeği işlemi bu TASK_RUNNING
duruma getirir .
Bununla birlikte, read()
blokaj gerekmediğinde (talep ii.) Ve talebi çekirdek uzayda işlerken, bir sinyalin gelmesi ve bunun ele alınmasının bir HW'nin gelmesi ve doğru şekilde ele alınması gibi şeffaf olacağını düşünürdüm. kesme olur. Özellikle, sinyalin gönderilmesi üzerine, işlemin , kesilen (çekirdek boşluğu içinde) kesilmesi işleminin bitmesi için eninde sonunda geri döneceği sinyal işleyicisini yürütmek için işlemin geçici olarak kullanıcı moduna geçirileceğini varsayıyordum . İşlem tamamlandıktan sonra işlem çağrının hemen sonrasında (kullanıcı alanında), sonuçta okunan baytların tümü geri döndüğü noktaya geri döner .read()
read()
read()
Fakat ii. read()
Veriler derhal mevcut olduğu için kesintiye uğradığını ima ediyor gibi görünüyor , ancak geri döndürüyor, verilerin yalnızca bir kısmını döndürüyor (hepsinden ziyade).
Bu beni ikinci (ve son) soruma getiriyor:
Soru B):
A) altındaki varsayımım doğruysa, read()
talebi derhal yerine getirebilecek veriler bulunduğundan engellenmesine gerek olmasa bile neden kesintiye uğruyor? Başka bir deyişle, read()
sinyal işleyiciyi yürüttükten sonra neden devam edilemiyor, sonuçta tüm mevcut verilerin (sonuçta mevcuttu) döndürülmesine neden oluyor?