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
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/uptime
tamamen 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çinfs/proc/uptime.c
the commit that made it atomic. Bir ön-2.6.30 çekirdeği,open
dosya,read
biraz, sonra sen sonra gel veread
tekrar parça almak olacak tutarsız olan ilk parça. (Ben sadece bu eğlenceli için kendiniz deneyin gösterdi.)/proc/mounts
read
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 birread()
bakm_start()
infs/namespace.c
ve bakın yakala bir semafor korumaları listesi mountpoints, hangi tutar kadarm_stop()
çağrılan zamanread()
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/tcp
aslı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çindelistening_get_next()
innet/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.
Kopyalama aklı başında, güvenli ve ver...
Onları URL ve dosya adı için dizeleri ...
Orada dizeleri-dosya yolu c güvenli ya...
Nasıl güvenli bir şekilde Java bir diz...
Python kullanarak bir dosya var olup o...