Differenze tra le versioni di "Poll ()"
(Creata pagina con "La funzione int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) attende un evento su un descrittore di file (''file descriptor''). In particolare la funzione ''poll...") |
|||
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
La funzione | La funzione | ||
int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) | int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) | ||
− | attende un evento su un descrittore di file (''file descriptor''). In particolare la funzione | + | attende un evento su un descrittore di file (''file descriptor''). In particolare la funzione "poll()" permette ad un programma di monitorare un descrittore di file, ossia di restare in attesa fino a quando il descrittore di file ''osservato'' non diventa "pronto" per eseguire un'operazione di I/O sul suo file corrispondente (ad esempio, leggere senza bloccare o effettuarvi una breve scrittura). |
− | Si è notato che la funzione | + | Si è notato che la funzione "poll()" funziona, come dovuto, solo utilizzando le funzioni esterne delle librerie standard di C, all'uopo previste per l'apertura del file-device e la lettura del relativo ''file-descriptor''. |
Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale essa è contenuta: | Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale essa è contenuta: | ||
Private <FONT color=#B22222>Extern poll</font>(__fds As Pollfd, __nfds As Long, __timeout As Integer) As Integer | Private <FONT color=#B22222>Extern poll</font>(__fds As Pollfd, __nfds As Long, __timeout As Integer) As Integer | ||
− | + | Mostriamo un semplice esempio, nel quale si porrà sotto ''osservazione'' in lettura il file-device "''/dev/input/mouse0'' " del mouse. Se giungono dati dal file-device, il ''file-descriptor'' è <U>pronto</u> per essere letto; e pertanto si raccoglieranno appunto i dati provenienti dal predetto file-device del mouse. Ai fini del seguente esempio va ricordato che il file-device "''/dev/input/mouse0'' " è protetto; pertanto <U>bisognerà preliminarmente cambiare i suoi permessi</u>. | |
− | |||
− | Mostriamo un semplice esempio, nel quale si porrà sotto ''osservazione'' in lettura il file-device "''/dev/input/mouse0''" del mouse. Se giungono dati dal file-device, il file-descriptor | ||
Library "libc:6" | Library "libc:6" | ||
Riga 24: | Riga 22: | ||
<FONT Color=gray>' ''int open (const char *__file, int __oflag, ...)'' | <FONT Color=gray>' ''int open (const char *__file, int __oflag, ...)'' | ||
' ''Open FILE and return a new file descriptor for it, or -1 on error.''</font> | ' ''Open FILE and return a new file descriptor for it, or -1 on error.''</font> | ||
− | Private Extern | + | Private Extern open_C(__file As String, __oflag As Integer) As Integer Exec "open" |
<FONT Color=gray>' ''int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)'' | <FONT Color=gray>' ''int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)'' | ||
Riga 39: | Riga 37: | ||
− | + | Public Sub Main() | |
Dim pfd As New Pollfd | Dim pfd As New Pollfd | ||
Riga 45: | Riga 43: | ||
Dim buf As Pointer | Dim buf As Pointer | ||
− | + | microsec = 10 | |
− | + | buf = Alloc(SizeOf(gb.Byte), 8) | |
− | + | Do | |
− | + | pfd.fd = open_C("/dev/input/mouse0", O_RDONLY) | |
− | + | pfd.events = POLLIN | |
− | + | rit = <FONT color=#B22222>poll</font>(pfd, 1, microsec) | |
− | + | read_C(pfd.fd, buf, 8) | |
− | + | <FONT Color=gray>' ''Vengono mostrati i dati intercettati dal file-device del mouse in caso di spostamento del mouse, nonché pressione dei tasti e della rotellina:''</font> | |
− | + | Print Right(CStr(Pointer@(buf)), 6) | |
− | + | close_C(pfd.fd) | |
− | + | Loop | |
− | + | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Versione attuale delle 14:49, 15 giu 2024
La funzione
int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
attende un evento su un descrittore di file (file descriptor). In particolare la funzione "poll()" permette ad un programma di monitorare un descrittore di file, ossia di restare in attesa fino a quando il descrittore di file osservato non diventa "pronto" per eseguire un'operazione di I/O sul suo file corrispondente (ad esempio, leggere senza bloccare o effettuarvi una breve scrittura).
Si è notato che la funzione "poll()" funziona, come dovuto, solo utilizzando le funzioni esterne delle librerie standard di C, all'uopo previste per l'apertura del file-device e la lettura del relativo file-descriptor.
Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale essa è contenuta:
Private Extern poll(__fds As Pollfd, __nfds As Long, __timeout As Integer) As Integer
Mostriamo un semplice esempio, nel quale si porrà sotto osservazione in lettura il file-device "/dev/input/mouse0 " del mouse. Se giungono dati dal file-device, il file-descriptor è pronto per essere letto; e pertanto si raccoglieranno appunto i dati provenienti dal predetto file-device del mouse. Ai fini del seguente esempio va ricordato che il file-device "/dev/input/mouse0 " è protetto; pertanto bisognerà preliminarmente cambiare i suoi permessi.
Library "libc:6" Private Const POLLIN As Integer = 1 Private Const O_RDONLY As Integer = 0 Public Struct Pollfd fd As Integer events As Short revents As Short End Struct ' int open (const char *__file, int __oflag, ...) ' Open FILE and return a new file descriptor for it, or -1 on error. Private Extern open_C(__file As String, __oflag As Integer) As Integer Exec "open" ' int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) ' Poll the file descriptors described by the NFDS structures starting at FDS. Private Extern poll(__fds As Pollfd, __nfds As Long, __timeout As Integer) As Integer ' ssize_t read (int __fd, void *__buf, size_t __nbytes) ' Read NBYTES into BUF from FD. Private Extern read_C(__fd As Integer, __buf As Pointer, __nbytes As Long) As Long Exec "read" ' int close (int __fd) ' Close the file descriptor FD. Private Extern close_C(__fd As Integer) As Integer Exec "close" Public Sub Main() Dim pfd As New Pollfd Dim microsec, rit As Integer Dim buf As Pointer microsec = 10 buf = Alloc(SizeOf(gb.Byte), 8) Do pfd.fd = open_C("/dev/input/mouse0", O_RDONLY) pfd.events = POLLIN rit = poll(pfd, 1, microsec) read_C(pfd.fd, buf, 8) ' Vengono mostrati i dati intercettati dal file-device del mouse in caso di spostamento del mouse, nonché pressione dei tasti e della rotellina: Print Right(CStr(Pointer@(buf)), 6) close_C(pfd.fd) Loop End