2011-08-20 22 views
18

Hata ayıklama amacıyla, geçerli bir okunabilir sayfaya işaret edip etmediğini görmek için bir işaretçiyi test etmem gerekiyor. Şu anda adresin eşlenip eşleşmediğini görmek için/proc/[pid]/map parsing ediyorum, fakat bu biraz uzun soluklu görünüyor. Daha iyi bir yolu var mı? Teşekkürler.Bir linux userpace uygulamasında bir adres okunabilirse nasıl test edilir

+1

Ben/proc/self/maps' de ayrıştırma yapıyorum –

+0

@GregoryPakosz: Bu genel ve güvenilir bir çözüm olmak için, her şeyi kontrol etmek ve yeniden hesaplamak gerekmez. büyüyen bir yığın veya yeni eşlenmiş bellek bölümleri gibi? – etherice

+0

@etherice: Hayır çünkü/proc kendini yeniliyor; Bir/proc dosyasına/dosyalarına her eriştiğinizde, çekirdek kodu "içerik" olduğunu yeniden üretir. – kaiwan

cevap

17

Kanonik yol, sayfadan okumak için write() sistem çağrısını kullanmaktır (bir dummy pipe() dosya tanıtıcısına yazma). Hata yerine, okunacak tampon okunamazsa -1errno == EFAULT ile geri dönecektir.

+0

Teşekkürler, bu bir tedavi! – gimmeamilk

+3

Uyarı: En az bir başka SO çözümünün bu amaç için/dev/null kullanılmasını önerdiğini gördük (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), ancak daha yeni çekirdekler (3.8 üzerinde test ettim) .7) 'buf' NULL olsa bile/dev/null write() için dönüş başarısı. Bu test, üzerinde test ettiğiniz herhangi bir sistemde/dev/null ile çalışırken, kesinlikle taşınabilir bir çözüm değildir. Başka bir fd (kukla boru veya posix shm nesnesi gibi) kullanmak hızlı olmaz ama kesinlikle daha güvenli ve daha taşınabilir olur. – etherice

İlgili konular