2014-12-28 12 views
6

Linux'ta sysfs GPIO ile çalışırken, POLLPRI ve POLLERR olayları için poll bildirmeniz istenir.Düzenli bir dosyada bir POLLPRI olayını nasıl oluşturabilirsiniz?

Bu oldukça kolaydır:

poll = select.poll() 
poll.register(filename, select.POLLPRI | select.POLLERR) 
result = poll.poll(timeout=timeout) 

Ancak, ben buna güvenerek uygulama için bu kodu testler ve simülasyon testleri yazmak istiyorum. Yani, bir POLLPRI olayına neden olabilmem gerekiyor.

Bir Unix alan soketi kullanmayı denedim, ancak etki alanı soketi bağlandıktan sonra dosyayı okumak için açılamıyorum (errno 6, böyle bir aygıt yok). Ayrıca, SOCK_DGRAM numaralı bir soketi kullanmayı denedim, ancak bu dosya zaten oluşturulmamışsa ya da bağlantı reddedilmişse dosyayı bulamıyor.

Düzenli bir dosya açmanın veya normal bir dosya gibi açılabilen bir dosya oluşturmanın ve onu "acil veri" olarak değerlendirilen iletilerin bir akışını gönderebilmenin bir yolunu bulmak istiyorum. yani MSG_OOB.

Ne yapabilirim?

cevap

2

Bu, procfs'de açığa çıkan bir sysctl yoklanarak bunu gerçekleştirebilirsiniz. poll implementation in procfs for the sys subdirectory'a bakarsanız, yoklama için bildirimleri uygulayan tüm sysctl'lerin POLLERR|POLLPRI'u içeren bir maske döndüreceğini görürsünüz. Peki, sysctls'ın bunu nasıl uygulayacağını nasıl anlarız? proc_sys_poll_notify'un kullanımlarını arıyoruz!

Böyle bir yer, 'un altında bir dizi sysctls uygulayan proc_do_uts_string numaralı sitedir. Bunların çoğu salt okunur, ancak hostname ve domainname yazılabilir (ayrıca bkz. table entries). Tabii ki, bu, örneğin, örn. /proc/sys/kernel/hostname.

Bu, sentetik bir dosya sistemi uygulamasında kalırken muhtemelen böyle bir şeyi yapmanın en kolay yoludur. Tabii ki, kodunuzu test etmek için sadece kodu poll(2) pinlerinden biri, bir düğmeye basın ve yükselen/düşen sinyal kesintilerinizi alıp almadığınızı görün.

Not: sysfs also does this for edge nodes in the tree:

>>> import select 
>>> f = open('/sys/bus/clockevents/devices/clockevent0/uevent', 'r') 
>>> p = select.poll() 
>>> p.register(f, select.POLLPRI | select.POLLERR) 
>>> result = p.poll(10) 
>>> result 
[(3, 10)] 

10

tabii POLLPRI (0x2) | POLLERR (0x8) taşımaktadır. Benim girdim olarak /sys/power/state kullanarak aynı sonuçları aldım. Temel olarak, sysfs'de kullanıcı tarafından okunabilen, dizin dışı bir dosya girişini incelerseniz, POLLPRI | POLLERR geri alırsınız.

+0

Çok havalı. Kök gereksinimi ve/proc/sys/kernel'de dokunaklı şeylerin potansiyel yan etkileri nedeniyle cevabı kabul etmeyeceğim, ancak sizin için ne istediğini sağladığını, bu yüzden sizin için lütfunu! – ToBeReplaced

+0

Sentetik dosya sistemlerinde diğer POLLPRI örneklerini kazmak için benzer bir metodoloji kullanabilirsiniz; Bunu her zaman döndüren bir arayüz bulabilirsin - Kolay bir şey bulamadım, ama sadece birkaç dakikalığına baktım ve hangi cihazların müsait olduğunu bilmiyorum. Bu en azından biraz yardımın olduğuna sevindim! – dho

+0

Kök gerekmeyen bir strateji, sysfs dosyaları yoklama bulundu. Belki de bu soruya tatmin edici bir cevaptır? – dho

İlgili konular