dinamik yükleyici sadece düzenli eski open(2)
ve mmap(2)
çağrıları yapar ve bir bellek haritası inode refcounts açık fd yok aynı şekilde darbe. Bu nedenle, kütüphane için her zamanki atomik-dosya-değiştirme kodunu yaparsanız, değişikliklerinizi dosyanın yeni bir kopyasına yazın ve daha sonra eski adın üzerine rename(2)
, o noktadan sonra başlatılan her şey yeni inode'u ve yeni içerikler, ancak çalışan programlar eski inode'u ve eski içerikleri kullanmaya devam edecektir.
Kitaplığı yerinde değiştirirseniz, doğal olarak, write
numaralı çağrıdan sonra başlatılan tüm programlar değişikliklerinizi alır. Daha ilginç olan soru, halihazırda haritalanmış olan işlemlere ne olduğudur. Cevap muhtemelen "sistem bunu yapmanıza izin vermez" veya "belirtilmemiş, sayfa önbellek uygulamasının ayrıntılarına bağlıdır". Linux uygulamasında kayıtsızca çağrışım (elimde ne var ki): Glibc dinamik yükleyicisi, tüm paylaşımlı kütüphane haritaları için MAP_DENYWRITE
'u kullanır, ancak belgelenmemiş olan sesleri sesini "bu dosyayı eşleme sırasında değiştirilemez hale getir" anlamına gelir . Ancak, çekirdek kaynaklarında hiçbir şey bulamadığım MAP_DENYWRITE
herhangi bir şey; Tarihsel bir yelek ya da benzeri olabilir.
Ayrıca MAP_PRIVATE
kullanır. http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html, "MAP_PRIVATE eşlemesi oluşturulduktan sonra temel nesneye yapılan değişikliklerin MAP_PRIVATE eşleştirmesiyle görünür olup olmadığı belirtilmemiş." Dolayısıyla, sayfa önbelleği uygulamasının ayrıntılarına bağlı olarak, çalışan bir işlemin altında paylaşılan bir kitaplık görüntüsünü değiştirebilir veya değiştiremezsiniz.
aslında bu soruya cevap vermiyor – zwol