Next: Les extensions de read Up: Les outils de sélection Previous: La primitive select

La primitive poll

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:

POLLIN
Données non prioritaire peuvent être lues.
POLLRDNORM
idem.
POLLRDBAND
Données non prioritaire non normales peuvent être lues.
POLLPRI
Données prioritaire peuvent être lues.

POLLOUT
Données non prioritaire peuvent être écrites, les messages de haute priorité peuvent toujours êtres écrits.
POLLWRNORM
idem
POLLWRBAND
Données non prioritaire non normales peuvent être écrites sans bloquer.

Pour les revents (valeurs de retour de la primitive poll):

POLLIN,POLLRDNORM,POLLRDBAND,POLLPRI
les données sont là.
POLLOUT,POLLWRNORM, POLLWRBAND
l'écriture est possible

POLLERR
Une erreur a eu lieu.
POLLHUP
La ligne a été coupée.
POLLNVAL
Descripteur invalide.

Le mode de blocage de la primitive poll dépend du paramètre timeout

timeout == INFTIM
Bloquant, INFTIM est défini dans stropts.h.
timeout == 0
Non bloquant.
timeout > 0
Semi bloquant, attente de timeout micro secondes.

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
Mon Feb 2 12:10:31 MET 1998
Une Bug Un mail Merci