Bonjour, j'utilise ce morceau de code pour insérer un tuyau dans TCL. Quelqu'un peut-on me laisser comprendre quand cette condition Dans mon cas, il ne renvoie jamais un nombre négatif et le testengine est suspendu à jamais p> [get $ ligne de tuyau]> = 0 code> échoue.
Par exemple: seulement lorsque
[get $ tuyau ligne] code> est un nombre négatif que cela échouera.
set pipeline [open "|Certify.exe filename" "r+"]
fileevent $pipeline readable [list handlePipeReadable $pipeline]
fconfigure $pipeline -blocking 0
proc handlePipeReadable {pipe} {
if {[gets $pipe line] >= 0} {
# Managed to actually read a line; stored in $line now
} elseif {[eof $pipe]} {
# Pipeline was closed; get exit code, etc.
if {[catch {close $pipe} msg opt]} {
set exitinfo [dict get $opt -errorcode]
} else {
# Successful termination
set exitinfo ""
}
# Stop the waiting in [vwait], below
set ::donepipe $pipe
} else {
puts ""
# Partial read; things will be properly buffered up for now...
}
}
vwait ::donepipe
6 Réponses :
du Documentation pour obtenir : P>
Si VARNAME est spécifié et qu'une chaîne vide est renvoyée dans VARNAME en raison de la fin de fichier ou des données insuffisantes en mode anti-bloque, puis le nombre de retours est -1. P> blockQuote>
Quelqu'un peut-il m'aider s'il vous plaît implémenter le tuyau en utilisant spawn attendre un mécanisme ??
La commande Les conditions d'erreur majeures (telles que le canal étant fermée) entraînent des erreurs TCL. P>
Si l'autre commande ne produit que des sorties partielles ou fait quelque chose de bizarre avec la tampon, vous pouvez obtenir un pipeline éternellement bloqué. Il est plus probable qu'un tuyau bidirectionnel, tel que vous utilisez, car la commande obtient code> (lorsqu'elle est donnée une variable pour recevoir la ligne) renvoie un numéro négatif lorsqu'il est dans une condition d'erreur mineure. Il y a deux de ces conditions: p>
obtient code> la commande
eof code> (appliqué sur le canal) signalera une valeur réelle dans ce cas. li>
chan et en attente code>). Vous ne voyez que cela lorsque la chaîne est en mode non bloquante (car sinon, le
obtient code> attendra indéfiniment). Dans ce cas, la commande
fblocké code> (appliquée au canal) reviendra true. Li>
ol>
certifie code> vous attend probablement que vous fermez l'autre extrémité. Pouvez-vous l'utiliser en lecture seule? Il y a beaucoup de complexités em> pour interagir correctement avec un processus bidirectionnel! (Par exemple, vous souhaitez probablement rendre le mode tampon em> de la sortie du tuyau em> sans perfectionner,
FConfigure $ Pipeline-Buffing Aucun Code>.) P>
Donal, merci pour votre réponse. Mais j'ai déjà essayé d'utiliser FConfigure $ Pipeline -Buffering Aucun après FConfigure $ Pipeline -Blocking 0 et dans le processus aussi. Toujours face au même problème.Aussi essayé de donner l'accès en lecture seule pour le tuyau. Aucune amélioration sur elle. Pouvez vous me donner un coup de main
Oui, il y a d'autres choses qui peuvent aller mal aussi. Par exemple, le sous-processus pourrait détecter qu'il écrit sur un tuyau et une mémoire tampon sa sortie; Vous avez peu de contrôle sur ça! Sauf que ... vous pouvez probablement utiliser attendre code> ("probablement" à cause de certaines nuances de fenêtres). Ce qui est très i> différent (malgré une extension TCL), mais peut être utilisé pour automatiser les programmes de problèmes. Tout cela obtient beaucoup plus compliqué i> malheureusement.
Pouvez-vous s'il vous plaît convertir mon bloc de pipeline en (Spawn attendre) si cela devait travailler ???
Suivez un didacticiel de base i> à l'aide d'attendu, souvenez-vous de SPAWN CODE> Certify Executable au lieu de
EXEC code>. Le code que j'ai écrit ne convertit pas vraiment, et n'a pas besoin de: i> Attendez-vous beaucoup plus et travaille (de votre point de vue) à un niveau beaucoup plus élevé.
Votre script fonctionne complètement bien. Vérifié avec Définir Pipeline [Ouvrir "| du / USR" "R +"]
code> au lieu de votre tuyau et inclus
met "ligne: $ line" code> pour vérifier le résultat. Il est donc clair qu'il y a un problème dans la commande
certifie code>. Pouvez-vous partager votre commande, comment utilisez-vous sur Terminal et comment avez-vous utilisé avec
EXEC code>?
################### edited by Drektz
set pipeline [open "|du /usr" "r+"]
fileevent $pipeline readable [list handlePipeReadable $pipeline]
fconfigure $pipeline -blocking 0
proc handlePipeReadable {pipe} {
if {[gets $pipe line] >= 0} {
# Managed to actually read a line; stored in $line now
################### included by Drektz
puts "Line: $line"
} elseif {[eof $pipe]} {
# Pipeline was closed; get exit code, etc.
if {[catch {close $pipe} msg opt]} {
set exitinfo [dict get $opt -errorcode]
} else {
# Successful termination
set exitinfo ""
}
# Stop the waiting in [vwait], below
set ::donepipe $pipe
} else {
puts ""
# Partial read; things will be properly buffered up for now...
}
}
vwait ::donepipe
Veuillez trouver l'image que j'ai posté Drektz, comme vous l'avez dit, j'ai déjà essayé cette solution de contournement aussi
Dans l'instantané, je peux voir que vous avez utilisé TestengineSourceDeDeDeDeDeDeDeDeDeDecot.tcl (et je suppose, dans ce fichier, le pipeline est utilisé, pas exécuté) i>, et il se bloque pour
trialkilldle code>. Pouvez-vous confirmer que
certifié.exe code> ne se bloque pas lorsque vous l'exécutez autonome (c.-à-d. Ne pas utiliser de script TCL, mais directement comme
certifié.exe $ p0 $ p0 $ p1 ... $ ... $ P15 code> sur borne) avec les mêmes paramètres utilisés dans le script i>? Une autre chose, vous pouvez essayer
exécrtify.exe $ p0 $ p1 ... $ p15 & code> comme cela l'exécutera en arrière-plan afin d'obtenir le contrôle à TCL.
Même lorsque j'utilise la commande EXEC, je suis confronté au même problème. Je l'ai déjà essayé. Puis implémenté le mécanisme de tuyau.
EXEC code> en arrière-plan b> Utilisation & b> IE
EXEC cmd args & code> retournera à votre script quel que soit le résultat.
Essayé cela aussi.still face au même problème. Mais au contraire lorsque j'utilise juste certifiquement.exe args dans l'invite de commande, le contrôle sort.
Lors de l'utilisation de EXEC CMD arguments dans TCLSH, face au problème
Je sais que vous avez essayé EXEC cmd args code> et cela n'exécutera pas la commande en arrière-plan. Pour exécuter en arrière-plan, vous devez ajouter
& code> et votre commande sera
exec cmd args & code>
J'ai fait que M. Drektz, toujours iam face au même problème
Veuillez trouver la manière dont le processus de certification est déclenché à partir de l'invite de commande et les instructions d'impression sont données uniquement pour la compréhension. À la fin, le processus est suspendu et le contrôle n'est pas transféré à la TCL p>
Il s'agit également de la manière dont j'ai inséré un tuyau dans le script de test de test pour déclencher le processus de certification: définir le pipeline [Ouvrir "| Certify.exe $ Paramètres (0) $ Paramètres (1) $ Paramètres (2) $ Paramètres (3) $ Paramètres (3) $ Paramètres (3) $ Paramètres (4) $ Parameters (5) $ Paramètres (6) $ Paramètres (7) $ Paramètres (8) $ Paramètres (9) $ Paramètres (10) $ Paramètres (11) $ Paramètres (12) $ Paramètres (13) $ Paramètres (13) $ Paramètres (14) $ Paramètres (15) "" R "]. Ce sont le groupe de paramètres à transmettre pendant l'exécution.Comment puis-je utiliser Spawn-attendre ici ??? Parce que quand j'utilise Spawn au lieu d'ici, je suis confronté à un problème.
Merci d'avoir pris votre temps pour répondre à Bryan
Vous pouvez le voir dans la cmdwith et la capture d'écran mentionnée. Certains contournements de contournement que je dois surmonter le problème p>
Veuillez consulter le problème lorsqu'il est exécuté à l'aide d'EXEC exécutable args & p>
Aussi affiché Vwait :: Donepipe en bas
Je suppose que Certify Program est uniquement du texte. Est-ce que
définit la sortie [EXEC CERTIFY.EXE FileName]; met la sortie $ code> fournir la bonne sortie?
Le
ouvert | ... R + code> est un signe de danger. Les tuyaux bidirectionnels ont lots i> plus de façons qu'ils peuvent échouer, tels que l'autre côté qui décider de tamponner plus longtemps que vous le souhaitez, ou de ne pas produire de sortie jusqu'à ce que le côté entrée soit fermé ...
Salut Glenn, ici dans le proc, je l'ai appelé nom de fichier.Mais dans notre projet, pour le certificat (outil), nous transmettrons un tas de paramètres pour pouvoir déclencher le script.
En plus de ce glenn, lorsque j'utilise la commande EXEC pour appeler un processus externe (certifier dans mon cas), le script de script TCL (Moteur de test) est suspendu pour toujours. Pourquoi, a essayé d'utiliser un tuyau
Qu'est-ce que
certifie.exe code> faire? Pourrait-il essayer de lire directement du TTY plutôt que de Stdin? Pourrait-il attendre une autre ressource externe? Peut-être qu'il n'est tout simplement pas conçu pour être exécuté dans un pipeline.
Mais cela ne fonctionne pas avec l'aide de la commande EXEC.