Salut,
est-ce que quelqu'un pourrait m'indiquer comment on fait pour lire un pipe de façon non-bloquante
Un exemple serait le bienvenue
Merci
Salut,
est-ce que quelqu'un pourrait m'indiquer comment on fait pour lire un pipe de façon non-bloquante
Un exemple serait le bienvenue
Merci
je te conseilles d'utiliser select().
select() est une fonction quasi-incontournable dans le developpement reseau.
Elle permet de connaitre l'etat de tes files descriptors.
En clair de savoir si il y a actuellement des donnees a lire et a ecrire dessus.
Explication :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include <sys/select.h> #include <time.h> void my_func(int fd, int fd2) { fd_set read_mask; fd_set write_mask; struct timeval tempo; int rsel; FD_ZERO(&read_mask); FD_ZERO(&write_mask) FD_SET(fd, &read_mask); FD_SET(fd2, &write_mask) /* ** La tu ajoutes d'autres fd. */ tempo.tv_sec = NB_SEC; tempo.tv_usec = NB_USEC; rsel = select(MAX_FD + 1 , &read_mask, &write_mask, NULL, &tempo); if (rsel) { if (FD_ISSET(fd) { } if (FD_ISSET(fd2) { } /* ** Etc.... */ } return ; }
Au debut tu defini les fd a verifier dans deux champs de type fd_set.
Tu defini un timeout. Si il est a 0, select est totalement non-bloquant. Si tu utilises NULL, select est totalement bloquant.
Tu appelles select.
Lis le man pour plus d'explications, mais select se debloque a la fin du timeout, en te retournant le nombre de fd disponibles en lecture/ecriture.
Ensuite tu verifies les fd dans tes masks avec la macro FD_ISSET.
Salut,
merci pour ce code mais je ne fais pas de réseau
Est-ce que tu aurais un exemple avec la lecture de pipe non-bloquant.
Merci
Un pipe est un un fd comme un autre.Envoyé par Premium
fd => file descriptor.
D'ailleurs les exemples d'utilisation de pipe sur le net sont courants.
Note: penser a preciser sa recherche sur Google, et de preference en anglais. taper pipe c'est dangereux. On tombe sur de ces choses....
la fonction pipe(2) te revoie une paire de fd.
Select(2) attend des champs de fd en parametres.
Mon allusion en reseau etait purement informative.
Sinon tu peux aussi regarder du cote de fcntl(2). C'est la fonction utilisee pour manipuler les files desciptors.
On peut les rendre non bloquant avec.
Du moins je crois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void test_func() { int fd_tab[2]; pipe(fd_tab); if (fcntl(fd_tab[0], F_SETFL, O_NONBLOCK) == -1) { /* Traitement de l'erreur */ } /* ** ... */
Lis le man de fcntl(2) si tu prefere cette solution.
Mais je te previens il est assez touffu.
ben pareil, tu remplace le socket par une pipe si tu est sous linux ... sous windows la foncton select ne marche QUE sur le sockets. (sont bizzarre chez M$)
Oups.Envoyé par Dark_Ebola
Zavai oublie Windows. Suis desole. Le ferais plus promis...
WaitForMultipleObjects()Envoyé par Jack_serious
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager