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
cevap
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 -1
errno == EFAULT
ile geri dönecektir.
Teşekkürler, bu bir tedavi! – gimmeamilk
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
Ben/proc/self/maps' de ayrıştırma yapıyorum –
@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
@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