2011-11-08 31 views
16

Bu, genel olarak sistem çağrıları ile ilgili olduğunu düşündüğünden, yalnızca soketler üzerine gönderilmediğinden, Is a successful send() "atomic"? için bir sonraki soru.Sistem çağrıları ne zaman ve nasıl kesilir?

Hangi sistem çağrıları kesintiye uğrayabilir ve ne zaman kesintiye uğruyor? SA_RESTART hakkında bilgi aldım, ama neler olduğunu tam olarak anlamadım. Ben SA_RESTART olmadan bir sistem çağrısı yaparsanız

  • , çağrı kesmeleri her türlü ile kesilebilir (örn kullanıcı girişi) çağrımı iptal ve bir şeyler yapmak başvurumu endişe, ancak OS gerektirmeyen Başka? Yoksa sadece sürecimle doğrudan ilgili olan sinyaller tarafından kesiliyor mu (CTRL + C, soket kapalı, ...)?

  • SA_RESTART değerini ayarlarken, bir gönderenin() veya başka bir "yavaş" syscall'ın semantiği nedir? Tüm verilerim iletilene veya yuvaya inene kadar her zaman engellenecek mi yoksa send() 'ın parametresindeki sayımdan daha küçük bir sayı ile geri dönecek mi?

  • Yeniden başlatma nerede uygulanmaktadır? İşletim sistemi, aramanın herhangi bir kesinti halinde yeniden başlatılmasını istediğimi veya işlemime gönderilen ve daha sonra kütüphane koduyla gönderilen bir sinyalin olduğunu biliyor mu? Veya bunu kendim yapmak zorundayım mı? aramayı bir süre döngüsüne sarın ve gerektiği kadar tekrar deneyin.

cevap

9

Sistem çağrıları herhangi signal ile bölünebilmektedir, bu vb (CTRL C tarafından oluşturulan) sigint, SIGHUP, gibi sinyaller SA_RESTART ayarlandığında

, bir send() geçer (içerir gönderilen sayım) sinyal alınmadan önce herhangi bir veri iletildiyse, bir gönderme zaman aşımı ayarlanmışsa (yeniden başlatılamadığı için) EINTR hata döndürecektir, aksi takdirde send() yeniden başlatılacaktır.

Kernel'in sinyal işleme kodunda sistem çağrısı yeniden başlatılıyor. Sistem çağrısı, beklemede olan bir sinyali (veya bir sinyalin kesintiye uğramasını bekleyerek) tespit etmesi üzerine dahili olarak -ERESTARTSYS'u döndürür; bu, sinyal işlem kodunun, komut işaretçisini ve ilgili kayıtların, çağrıdan önceki duruma geri yüklenmesine neden olarak, sistem tekrarlamasını tekrarlar.

+1

Bu yalnızca sürecime gönderilen sinyaller anlamına gelir, değil mi? Bir şekilde kesilmemle uğraşan çekirdeğin (tuşa basma, fare hareketi, zamanlayıcı kesmesi, ...) herhangi bir şekilde kesilmesinin, çağrımın geri dönmesine ve gönderilecek sinyale neden olacağını varsaydım. Sistem çağrısı sırasında bir içerik anahtarı, zamanın yanı sıra sürecimi hiçbir şekilde etkilememelidir, değil mi? – lxgr

+1

@lxgr, bu doğru, içerik anahtarlama sistem çağrılarını iptal etmiyor. –

İlgili konular