Twitter iPhone pliant OnePlus 12 PS5 Disney+ Orange Livebox Windows 11 ChatGPT

Acces fichier non bloquant

8 réponses
Avatar
Dominique Vaufreydaz
Bonjour,

je ne dois pas etre en forme... Je cherche a faire l'equivalent de
fcntl(fileno(file), F_SETFL, O_NONBLOCK);
C'est a dire rendre un acces fichier non bloquant. Si je demande x octets,
j'en veux y avec 0 <= y <= x. J'ai pas mon MSDN sous la main la...

QQun peut-il m'aider ???

Merci. Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/

8 réponses

Avatar
David Scrève
"Dominique Vaufreydaz" a écrit dans le message de news:bfr3fb$hei$
Bonjour,

je ne dois pas etre en forme... Je cherche a faire l'equivalent de
fcntl(fileno(file), F_SETFL, O_NONBLOCK);
C'est a dire rendre un acces fichier non bloquant. Si je demande x octets,
j'en veux y avec 0 <= y <= x. J'ai pas mon MSDN sous la main la...

QQun peut-il m'aider ???


http://msdn.microsoft.com

David
Avatar
Arnaud Debaene
Dominique Vaufreydaz wrote:
Bonjour,


Bonjour.

je ne dois pas etre en forme... Je cherche a faire l'equivalent de
fcntl(fileno(file), F_SETFL, O_NONBLOCK);
C'est a dire rendre un acces fichier non bloquant. Si je demande
x octets, j'en veux y avec 0 <= y <= x. J'ai pas mon MSDN sous la
main la...



Je suis pas certain de comprendre : l'appel doit ête bloquant mais retourner
dès qu'il y a des données disponibles, ou bine il doit être non bloquant?
Dans le deuxième cas, il faut faire une E/S "overlapped" (voir la doc de
CreateFile).

Arnaud
Avatar
Dominique Vaufreydaz
Bonjour,

Je suis pas certain de comprendre : l'appel doit ête bloquant mais retourner
dès qu'il y a des données disponibles, ou bine il doit être non bloquant?
Dans le deuxième cas, il faut faire une E/S "overlapped" (voir la doc de
CreateFile).



1ere Solution. La seconde, je connais...

Merci. Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/
Avatar
Dominique Vaufreydaz
Bonjour,

Ok. Je ne suis pas certain que ce soit faisable pour un fichier.



Ben oui et non, ca peut se faire a la main mais bon, j'aurais
aime ne pas le faire... Rien trouve dans MSDN a ce propos,
rien non plus avec google... pffffffffffff....

Si
c'est sur une socket, il y a ioctlsocket avec argp=FIONBIO. Si c'est
pour un pipe, on est forcé d'utiliser un pipe nommé.



Le truc, c'est que c'est sur un fichier...

Le truc, c'est qu'il est evident qu'il doit y avoir un moyen de la faire.
C'est sur mais je sais pas comment sinon de le faire a la main...
Bon, je vais me palucher ca...

Merci en tout cas. Si qqun a la solution, je reste preneur ! Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/
Avatar
Arnaud Debaene
Dominique Vaufreydaz wrote:
Bonjour,

Ok. Je ne suis pas certain que ce soit faisable pour un fichier.



Ben oui et non, ca peut se faire a la main mais bon, j'aurais
aime ne pas le faire... Rien trouve dans MSDN a ce propos,
rien non plus avec google... pffffffffffff....



Si tu le fais toi-même ca va être sous-optimal. Tu comptes faire comment? En
ne demandant à lire qu'un seul caractère? Mais le gestionnaire te disque
renvoie lit les données par blocs d'au moins la taille d'un cluster, donc
potentiellement ca va aussi vite de lire 4KO que 1 octet (en supposant que
les clusters fassent 4KO). Tu comptes faire comment au juste?

Le truc, c'est que c'est sur un fichier...

Le truc, c'est qu'il est evident qu'il doit y avoir un moyen de
la faire. C'est sur mais je sais pas comment sinon de le faire a
la main... Bon, je vais me palucher ca...


Ben, tiens nous au courant comment tu fais ;-)

C'est quoi l'objectif au bout du compte? Parce que je vois pas trop
l'intérêt de faire de la lecture non bloquante sur un fichier, surtout à
cause du mécanisme de cache et de la lecture par blocs inhérente aux
disques. Tu est sûr qu'une I/O overlapped ne ferait pas l'affaire?

Arnaud
Avatar
Dominique Vaufreydaz
Bonjour,

Si tu le fais toi-même ca va être sous-optimal.



Je sais bien, c'est dommage qu'a priori l'OS ne le supporte pas (pfffffff,
il le fait bien pour les sockets !).

Tu comptes faire comment? En
ne demandant à lire qu'un seul caractère? Mais le gestionnaire te disque
renvoie lit les données par blocs d'au moins la taille d'un cluster, donc
potentiellement ca va aussi vite de lire 4KO que 1 octet (en supposant que
les clusters fassent 4KO).



Mon probleme n'est pas de pouvoir traiter 1 ou 4 Ko. De toute facon,
meme si tu fais un lecture de 1 octet, tu as le cache systeme qui a charge
d'avance un ou plusieurs blocs, donc question performances d'I/O
ca ne change pas grand chose sauf si tu fais un setvbuf avec aucun
buffer, la ca rame grave puisque tu fais tout en direct cluster par cluster
depuis le disque...

Ben, tiens nous au courant comment tu fais ;-)



Ben caractere par caractere, en testant si il en reste... C'est grave
sous optimal mais ca marche... Chiant mais fonctionnel quoi. Le temps
perdu est largement inferieur au temps gagne a faire le traitement.

C'est quoi l'objectif au bout du compte? Parce que je vois pas trop
l'intérêt de faire de la lecture non bloquante sur un fichier, surtout à
cause du mécanisme de cache et de la lecture par blocs inhérente aux
disques. Tu est sûr qu'une I/O overlapped ne ferait pas l'affaire?



J'ouvre en lecture un fichier qui est en ecriture par un autre
processus (qui ne peut produire que par fichier, j'ai pas la main
dessus pour faire des choses intelligentes). Le traitement de ces
données est lourd et commencer des que l'on a des données est
un bon point pour les performances. La production n'est pas non
plus continue ni previsible, donc j'ai besoin de pouvoir obtenir
moins de données que demandé si j'ai pas assez de données pour
remplir un buffer complet...

Bon, ben c'est vraiment un truc qui manque... Je pourrais faire
un OVERLAPPED, mais le truc c'est que le doit doitr etre le plus
possible portable et avoir le moins possible de code alternatif
type #ifdef WIN32 #endif car ca devitn vite imbitable ce genre de code.
Donc si la version Windows a besoin de lancer un thread pour
faire ce genre de chose alors que la version Linux ne fait qu'un fcntl
c'est plus du tout pareil. Si y'avait eu un appel equivalent a fcntl
c'etait juste un code alternatif sur une ligne ! Mon code semble
fonctionner (je debug a grande echelle aujourd'hui) et est
portable.

Voila. Merci. Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/
Avatar
adebaene
"Dominique Vaufreydaz" wrote in message news:<bg52kl$tuu$...

J'ouvre en lecture un fichier qui est en ecriture par un autre
processus (qui ne peut produire que par fichier, j'ai pas la main
dessus pour faire des choses intelligentes). Le traitement de ces
données est lourd et commencer des que l'on a des données est
un bon point pour les performances. La production n'est pas non
plus continue ni previsible, donc j'ai besoin de pouvoir obtenir
moins de données que demandé si j'ai pas assez de données pour
remplir un buffer complet...



Je viens de penser à un truc : tu peux simuler le comportemeent d'un
read non bloquant avec FindFirstChangeNotification(fichier, FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE), suivi de la lecture des données
nouvellement disponibles.

Bon, ben c'est vraiment un truc qui manque... Je pourrais faire
un OVERLAPPED, mais le truc c'est que le doit doitr etre le plus
possible portable et avoir le moins possible de code alternatif
type #ifdef WIN32 #endif car ca devitn vite imbitable ce genre de code.



Je suppose que tu es conscient que de toute façon, tu n'obtiendras pas
un code portable sur un truc système du genre lecture non bloquante.
Même entre les différents Unixs, le comportement d'une lecture
non-bloquante varie d'une implémentation à l'autre. Le tout c'est
d'encapsuler proprement les différences, par exemple en définissant
une interface commune qui est implémentée dans un fichier séparé pour
chaque plate-forme.

Arnaud
Avatar
Dominique Vaufreydaz
Bonjour,

Je viens de penser à un truc : tu peux simuler le comportemeent d'un
read non bloquant avec FindFirstChangeNotification(fichier, FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE), suivi de la lecture des données
nouvellement disponibles.



Le truc c'est aussi au demarrage, je ne peut avoir aucune certitude
sur le contenu du fichier. Faire un stat ne suffirait pas puisque l'autre programme
pourrait remplir le fichier entre temps...

Je suppose que tu es conscient que de toute façon, tu n'obtiendras pas
un code portable sur un truc système du genre lecture non bloquante.



Oui. J'ai un code qui semble me donner satisfaction et qui n'utilise
que du C super standard (fread) sans aucun cas limite. Donc ca
doit marcher... J'ai pas encore rebooter sur mon linux pour verifier,
mais ca doit foncitonner...

Même entre les différents Unixs, le comportement d'une lecture
non-bloquante varie d'une implémentation à l'autre. Le tout c'est
d'encapsuler proprement les différences, par exemple en définissant
une interface commune qui est implémentée dans un fichier séparé pour
chaque plate-forme.



Ou de faire un fonction en utilisnt que des fonctions C de base.
Je ne garanti pas pour l'instant que mon code marche (faut que
j'essaye sous Linux et Solaris, autres plateformes visées par
mon programme) mais sous Windows, ca fonctionne comme
je le souhaite...

Merci en tout cas pour ces pistes. Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/