SORU
19 NİSAN 2011, Salı


Güvenli /proc/ dosya ayrıştırılamıyor.

I /proc/net/tcp/, ayrıştırmak istiyor ama güvenli mi?

Nasıl başka bir işlem (veya OS kendisi) değişen olacak ve /proc/ dosyaları açın okuyun ve korkmayın, aynı zamanda etmeli miyim?

CEVAP
4 Mayıs 2011, ÇARŞAMBA


Genel olarak, hayır.(Cevaplar en çok burada yanılıyor.)olabilirgüvenli, ne istediğinize bağlı. Ama eğer /proc Bir dosya tutarlılığını hakkında çok fazla kabul kolay hataları ile sonuna kadar kodunuzda. Örneğin, this bug which came from assuming that /proc/mounts was a consistent snapshot bkz.

Örneğin:

  • /proc/uptimetamamen atombiri başka bir cevap ... ama belirtildiği gibiLinux 2.6.30 beridaha iki yaşında olan., Bu yüzden bile küçük, önemsiz bu dosya o zamana kadar bir yarış durumu tabi ki hala en kurumsal çekirdekleri. Mevcut kaynak için fs/proc/uptime.c the commit that made it atomic. Bir ön-2.6.30 çekirdeği, open dosya, read biraz, sonra sen sonra gel ve read tekrar parça almak olacak tutarsız olan ilk parça. (Ben sadece bu eğlenceli için kendiniz deneyin gösterdi.)

  • /proc/mountsread tek bir sistem çağrısı içinde atom.11 ** dosyanın tamamını tek seferde, sistem üzerindeki bağlama noktalarını tek tutarlı bir anlık görüntü almak. Kullanırsanız, ancak, birkaç read sistem çağrıları-ve eğer dosya çok büyük, bu tam olarak ne olacak kullanırsanız normal G/Ç kitaplıkları ve yok ödemek özel dikkat Bu konu ... tabi olacaktır bir yarış durumu. Sadece tutarlı bir anlık görüntü alabilir misin değil, ama bir başlangıç ve hiç hediye olmaktan önce var olan bağlama noktaları gördüğüne kayıp gidebilir. Bakın işte bu atom için bir read() bak m_start() in fs/namespace.c ve bakın yakala bir semafor korumaları listesi mountpoints, hangi tutar kadar m_stop() çağrılan zaman read() yapılır. Ne yanlış gidebilir görmek için, aksi takdirde this bug from last year (aynı ben yukarıda bağlantılı) yüksek kaliteli yazılım kaygısızca /proc/mounts okuma.

  • /proc/net/tcpaslında şöyle bir , veya daha az tutarlıdır.tablonun her satırı içinde atom. Bunu görmek için, sadece aşağıda aynı dosya içinde listening_get_next() in net/ipv4/tcp_ipv4.c established_get_next() bak, ve sırayla her girişte aldıkları kilitler bakın. Yeniden oluşturma kodu kullanışlı satır satır tutarlılık eksikliği göstermek zorunda değilim, ama tutarlı kılacak kilitleri (veya başka bir şey) yok. Eğer düşünürsen mantıklı -- ağ genellikle sistemin süper-yoğun bir parçasıdır, yükü bu tanı aracı olarak tutarlı bir bakış sunmak için değmez yani.

/proc/net/tcp her satır içinde atom tutan diğer parça in fs/seq_file.c okuyabilir seq_read(), tampon. Bu sağlar bir kez read() bölümü bir satır, metnin bir satırı tutulur bir tampon böylece bir sonraki read() elde kalan satır önce başlayan yeni bir tane. Aynı mekanizma kullanılır /proc/mounts tutmak için her satır atom bile eğer birden fazla read() çağırır ve bu da mekanizma /proc/uptime yeni çekirdekler kullanır kalmak atom. Bu mekanizma yokdeğilçekirdek bellek kullanımı konusunda temkinli olduğu için bütün dosyayı buffer,.

Çoğu dosya /proc olacak en azından tutarlı olarak /proc/net/tcp ile her satır bir tutarlı resmin bir giriş ne olursa olsun bilgi veren onlar, çünkü çoğu aynı seq_file soyutlama. /proc/uptime örnek gösterir, ama bazı dosyalar hala geçirilmiş olmak için kullanın seq_file en son 2009; eminim vardır hala kullanan eski mekanizmaları ve yok bile o seviyede katına çıkar. Bu uyarılar nadiren belgelenmiştir. Belirli bir dosya için tek güvence kaynağı okumaktır.

/proc/net/tcp, bunu okuyun ve korkmadan her satır ayrıştırılamadı. Ama eğer birden fazla satır aynı anda herhangi bir sonuç çıkarmak için çalışırsanız, dikkat, diğer işlemler ve çekirdekbunu okurken değiştirmek, ve muhtemelen bir hata oluşturuyorsunuz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • isupportthegosselins

    isupporttheg

    6 Aralık 2009