La primitive poll fournit un service proche de select avec une autre forme d'interface.
#include <stropts.h>
#include <poll.h>
int poll(struct pollfd fdarray[],
unsigned long nfds,
int timeout
);
struct pollfd {
int fd;
short events;
short revents;
};
Ici on spécifie la liste de descripteurs et ce que l'on veut sur chacun d'eux.
La valeur de retour est -1 en cas d'erreur, 0 si le temps d'attente timeout est écoulé, ou un entier positif indiquant le nombre de descripteurs pour lesquels poll a changé la valeur du champ revents.
Les évènements sont ici:
Pour les évènements de events:
Pour les revents (valeurs de retour de la primitive poll):
Le mode de blocage de la primitive poll dépend du paramètre timeout
stropts.h
.
Un Exemple
Attente de données sur ifd1 et ifd2, de place pour écrire sur ofd, avec un
délai maximum de 10 seconds:
#include <poll.h>
struct pollfd fds[3];
int ifd1, ifd2, ofd, count;
fds[0].fd = ifd1;
fds[0].events = POLLNORM;
fds[1].fd = ifd2;
fds[1].events = POLLNORM;
fds[2].fd = ofd;
fds[2].events = POLLOUT;
count = poll(fds, 3, 10000);
if (count == -1) {
perror("poll failed");
exit(1);
}
if (count==0)
printf("Rien `
n");
if (fds[0].revents & POLLNORM)
printf("Données a lire sur ifd%d`
n", fds[0].fd);
if (fds[1].revents & POLLNORM)
printf("Données a lire sur ifd%d`
n", fds[1].fd);
if (fds[2].revents & POLLOUT)
printf("De la place sur fd%d`
n", fds[2].fd);
Next: Les extensions de read Up: Les outils de sélection Previous: La primitive select
Dominique REVUZ