Alıntı (zafer):
>
- Sinyal işleme nasıl çalışıyor anlamadım, kısaca anlatabilir misin?
Programın işleyişi gönderilen sinyallerle kesintiye uğratılabilir. Bir kaç örnek: Ctrl-C gibi klavyeden kesme isteği için SIGINT, "sona er" emri için SIGTERM, başlatılan alt program sonlandığında SIGCHLD, vs.
Sinyallerin bir iyi tarafı, program ne kadar meşgul olursa olsun hemen haber alınabilmesidir. İşleyiş durur, gelen sinyal için ayarlanmış olan işlev çalıştırılır, ve ondan sonra program kaldığı yerden devam eder.
Sinyal işlevi işletilirken bile sinyal gelebileceğinden ya program ya da sistem içinden çıkılmaz duruma düşebilir. O yüzden sinyal işlevinin son derece basit olması gerekir. Hatta, sinyal işlevi içerisinden güvenli olarak yalnızca belirli POSIX işlevlerinin çağrılabilir. Şurada "Async-signal-safe functions" başlığı altında görülüyorlar:
http://man7.org/linux/man-pages/man7/signal.7.html
Neyse ki biz bu örnekte yalnızca bir modül değişkenine atama yapıyoruz.
Sonuçta da programımız Ctrl-C'ye basıldığından haberdar oluyor ve o değişken yoluyla bunu kendisin için kaydediyor.
Alıntı:
>
- sonlanmaSinyalleri degişkeni enum tipinde olsa daha iyi olmaz mı?
Bu örnekte farketmez ama genelde dizileri enum yapmak istemeyiz çünkü o diziden tek adet değil, her kullanıldıkları yerde tekrar tekrar oluşturulur. enum diziler bir anlamda C makroları gibidir: Her kullanıldıkları yere '[ SIGINT, SIGTERM ]' yazılmış ve böylece o yerlerde geçici diziler oluşturulmuş gibi olur.
Öte yandan, elemanları immutable yapılabilirdi ama referans içermeyen (yani, tamamen değer türü olan) elemanlar için const ile immutable arasında bir fark yok.
Alıntı:
>
- sig_handler fonksiyonu içindeki debug satırlarını çalıştıramadım, -debug anahtarı ile derlemeye çalıştığımda aşağıdaki hatayı veriyor.
Ben de derleyemedim. :) debug ile derlenir sanmışım ama olmadı. O işlevden yazdırmak yerine bir modül değişkenine atama yapıp sonra main içinden o değişkeni yazdırabiliriz.
Alıntı:
>
- sig_handler fonksiyonunun içindeki devam_mı değişkenine benim ihtiyacım yok ancak bunu kaldırınca programı CTRL+C ile sonlandıramıyorum, neden?
Sinyalin alındığını devam_mı'ya atayarak bildiriyoruz. main de o değere göre sonlanıyor. Benzer bir şey yapacaksan senin de devam_mı gibi bir değişkene ihtiyacın olacak.
Bir başka deyişle, sinyal geldiğinde main kesintiye uğrar ve sinyal işlevi işletilir ama main hemen sonra yine işlemeye başlar. Sonlanıp sonlanmamak yine de main'e kalmıştır. O yüzden, devam_mı'nın değerine bakıyor.
Alıntı:
>
- Örnek kodu RaspberryPI üzerinde GDC ile derlemeye çalıştığımda aşağıdaki hatayı aldım.
Yine gdc'nin sürümünden şüpheleniyorum. Herhalde @nogc'yi anlamıyor (veya @system'ı). Eğer o gdc'yi kullanmak zorundaysan bir de @nogc'yi kaldırarak dener misin. (Tabii başka hata alırsan ve o hata mesajı @nogc içeriyorsa tahminimde yanılmışım demektir. :) )
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]