PIPE
hStream = PIPE sPipeName FOR [ READ ] [ WRITE ] [ WATCH ]
Ouvre un tube (pipe) nommé en lecture, écriture ou les deux. Si le tube n’existe pas il sera automatiquement créé.
Un tube fournit un flux de communication unidirectionnel entre processus du même système. En d’autres termes, ils sont semi-duplex, c.a.d. les données se transfèrent dans une seule direction.
L’une des caractéristiques majeure d’un tube est qu’une donnée traversant le medium de communication est une donnée fugitive, une fois lue par le descripteur de lecture, elle ne peut pas être lue à nouveau.
Aussi, si nous écrivons des données continûment dans le descripteur d’écriture, alors nous serons capables de lire les données uniquement dans l’ordre dans lequel elles ont été écrites.
Quoi qu’il en soit, un tube doit être ouvert aux deux extrémités simultanément avant que vous pouviez procéder à une quelconque opération d’entrée ou de sortie sur lui. L’ouverture d’un tube en lecture bloque normalement jusqu’à ce qu’un autre processus ouvre le même tube en écriture.
Gambas implémente un tube FIFO(First-In, First-out). Pour une information complémentaire voyez MKFIFO dans les pages de manuel Linux/ Unix.
-
Si le mot clé
READ
est spécifié, alors le tube est ouvert en lecture.
-
Si le mot clé
WRITE
est spécifié, alors le tube est ouvert en écriture.
-
Si le mot clé
WATCH
est spécifié, le tube est surveillé par l’interpréteur :
-
Si au moins un octet peut être lu dans le tube , alors le gestionnaire d’ Evènement
Pipe_Read()
est appelé.
-
Si au moins un octet peut être écrit dans le tube , alors le gestionnaire d’ Evènement
Pipe_Write()=est appelé.
Si le tube est ouvert avec succès, un objet flux est retourné à la variable
hStream.
Les flux des tubes ne sont jamais tamponnés.
Erreurs
Message
|
Description
|
Access forbidden (43)
|
L’accès au tube demandé n’est pas autorisé, ou la permission de recherche est refusée pour l’un des répertoires du préfixe de chemin ou pour le nom de chemin, ou l’accès en écriture dans le répertoire parent n’est pas autorisé.
|
Device is full (37)
|
File name a du être créé mais le périphérique contenant Pipe name n’a plus de place pour un nouveau fichier.
|
Not a directory... (49)
|
Un composant utilisé comme répertoire dans Pipe name n’est pas, en fait, un répertoire.
|
System error... (42)
|
Autres erreurs système possibles :
-
Un trop grand nombre de liens symboliques a été trouvé lors de la résolution du chemin.
-
La longueur de l’argument du chemin excède le maximum de chemins ou un composant du chemin est plus long que le nom maximum.
-
Un composant du préfixe de chemin spécifié par "path" ne désigne pas un répertoire existant ou le chemin est une chaîne de caractères vide.
-
Le répertoire qui devrait contenir le nouveau fichier ne peut pas être étendu ou l’allocation de ressources par le système de fichiers a dépassé ses limites.
-
La limite du nombre total de fichiers ouverts par le système a été atteinte.
-
Pipe name fait référence à un fichier dans un système de fichiers en lecture seule et un accès en écriture a été requis.
|
]]
Exemples
' Imprime les messages envoyés à un tube
DIM hFile AS File
DIM sLine AS String
hFile = PIPE "/tmp/FIFO1" FOR INPUT
DO
READ #hFile, sLine, -256
IF NOT sLine THEN BREAK
PRINT sLine;
LOOP
Démarrez l’exécution de ce qui est ci-dessus dans une fenêtre, puis faites : ls > /tmp/FIFO1
Exemples
' Une autre façon de lire un tube si vous savez que les données forment un bloc de lignes de texte
Dim hFile As File
Dim sLine As String
hFile = Pipe "/tmp/FIFO1" For Read
Do
Line Input #hFile, sLine
If hFile.EndOfFile Then Break
Print sLine
Loop
Voir aussi