SORU
23 EKİM 2008, PERŞEMBE


Süreç ve sinyal arasındaki fark nedir?

Ekstra bir sinyal var bir uygulama işleyicisi eklemek üzereydim ve yazar bir süreç diğer sinyal işleyicileri kurmak için kullanılan olduğunu fark ettim. Sinyal kullanacaktım. Süreç kullanmalıyım kurallarına uyar ama eğer sıfırdan yazıyordum, hangisini seçmeliyim?

CEVAP
24 EKİM 2008, Cuma


Çok zorlayıcı bir sebep değil bunu yapmak için var sürece sigaction() kullanın.

signal() arabirim antik (ve dolayısıyla durumu kendi lehine ve C standardında tanımlanmıştır. Yine de, bayrakları sigaction() sadık signal() eski davranışlarını simüle etmek için izin vermek için açıkça eklendi kullandığınız sürece sigaction() önler istenmeyen özellikleri bir numarası vardır.

  1. signal() işlevi geçerli işleyicisi dönünceye kadar (zorunlu) geçerli işleyicisi yürütülürken diğer sinyalleri bloke ederken gelen diğer sinyalleri engellemez.
  2. signal() fonksiyonu (genellikle) hemen hemen tüm sinyaller için SIG_DFL (varsayılan) geri sinyal eylemi sıfırlar. Bu signal() işleyici, ilk iş olarak kendini yeniden gerekir anlamına gelir. Ayrıca açılır pencere güvenlik açığı arasında zaman zaman sinyal tespit ve işleyicisi yeniden sırasında olan bir ikinci derece sinyal geliyor, varsayılan davranış (genellikle kaldırabilir, bazen önyargı ile - nam-ı diğer core dosyası) oluşur.
  3. signal() tam davranış sistemleri arasında değişir — ve standartların varyasyonları izin verir.

Bu signal() yerine sigaction() kullanmak için genellikle iyi nedenler vardır. Ancak, sigaction() arayüzü tartışmasız daha iyi bir dolandırıcı.

Hangisi iki kullanın, alternatif sinyal tarafından cazip değil gibi arabirimler sighold(), sigignore(), sigpause() sigrelse(). İsmen sigaction(), ama sadece zar zor standartlaştırılmış onlar için alternatif ve ciddi kullanmak için Geriye doğru uyumluluk için yerine POSIX mevcuttur. POSIX standartları çok parçacıklı programlar onların davranışlarını da tanımsız olduğunu söylüyor unutmayın.

Çok parçacıklı programlar ve sinyaller bambaşka karmaşık bir hikaye.AFAIK, signal() sigaction() hem de çok iş parçacıklı uygulamalarda sorun yok.

42* observes*:

signal() Linux man page diyor ki:

Etkilerisignal()çok kanallı bir süreç içinde belirtilmemiş.

Böylece, sigaction() güvenli çoklu iş parçacıklı işlem kullanılabilecek tek olduğunu düşünüyorum.

Bu çok ilginç. Kılavuz sayfa bu durumda POSIX daha kesindir. POSIX signal() belirtir:

Eğer bu süreç çok kanallı, veya sürecin tek dişli ise ve sinyal tutucusu sonucu dışında yürütülür:

  • Süreciabort(), , *, *29raise()kill(), ya sigqueue() bloke olan bir sinyal oluşturmak için arıyorum
  • Döner engellemesini bekleyen bir sinyal engellenmemiş ve çağrı önce teslim olmak

davranıştır tanımlanmamış eğer sinyal işleyicisi gösterir herhangi bir nesne diğerinden daha errno ile statik depolama süresi dışında tarafından atanması, bir değeri, bir nesne olarak ilan etti volatile sig_atomic_t veya sinyal işleyicisi çağırır herhangi bir fonksiyon içinde tanımlanan bu standart dışında bir fonksiyonları listelenen Signal Concepts.

POSIX açıkça çok iş parçacıklı bir uygulama içinde signal() davranış biçimini belirler.

Bununla birlikte, sigaction() her şey olur da tercih aslında, her koşulda ve taşınabilir çoklu iş parçacıklı kod kullanmanız gerekir sigaction() yoksa ezici bir sebebi olamaz (gibi "tek kullanım fonksiyonları tarafından tanımlanan Standart C" — ve evet, C11 kod çok iş parçacıklı). Bu cevap açılış paragraf da diyor temelde.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • Orson Wang

    Orson Wang

    28 EKİM 2006
  • Tutorials Junction

    Tutorials Ju

    1 Ocak 2014