0
votes

La condition de rupture en cas de construction

Bonjour, j'utilise ce morceau de code pour insérer un tuyau dans TCL. Quelqu'un peut-on me laisser comprendre quand cette condition [get $ ligne de tuyau]> = 0 code> échoue. Par exemple: seulement lorsque [get $ tuyau ligne] code> est un nombre négatif que cela échouera.

Dans mon cas, il ne renvoie jamais un nombre négatif et le testengine est suspendu à jamais p>

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

tcl

7 commentaires

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 $ fournir la bonne sortie?


Le ouvert | ... R + est un signe de danger. Les tuyaux bidirectionnels ont lots 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 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.


6 Réponses :


0
votes

du Documentation pour obtenir :

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.


1 commentaires

Quelqu'un peut-il m'aider s'il vous plaît implémenter le tuyau en utilisant spawn attendre un mécanisme ??



1
votes

La commande obtient (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:

  1. Lorsque la chaîne a atteint la fin du fichier. après le obtient la commande eof (appliqué sur le canal) signalera une valeur réelle dans ce cas.
  2. Lorsque le canal est bloqué, c'est-à-dire quand il a certains octets mais pas une ligne complète (TCL a une mémoire tamponnée interne pour gérer cela; vous pouvez obtenir le nombre de En attente d'octets avec chan et en attente ). Vous ne voyez que cela lorsque la chaîne est en mode non bloquante (car sinon, le obtient attendra indéfiniment). Dans ce cas, la commande fblocké (appliquée au canal) reviendra true.

    Les conditions d'erreur majeures (telles que le canal étant fermée) entraînent des erreurs TCL.


    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 certifie vous attend probablement que vous fermez l'autre extrémité. Pouvez-vous l'utiliser en lecture seule? Il y a beaucoup de complexités pour interagir correctement avec un processus bidirectionnel! (Par exemple, vous souhaitez probablement rendre le mode tampon de la sortie du tuyau sans perfectionner, FConfigure $ Pipeline-Buffing Aucun .)


4 commentaires

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 ("probablement" à cause de certaines nuances de fenêtres). Ce qui est très différent (malgré une extension TCL), mais peut être utilisé pour automatiser les programmes de problèmes. Tout cela obtient beaucoup plus compliqué 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 à l'aide d'attendu, souvenez-vous de SPAWN Certify Executable au lieu de EXEC . Le code que j'ai écrit ne convertit pas vraiment, et n'a pas besoin de: Attendez-vous beaucoup plus et travaille (de votre point de vue) à un niveau beaucoup plus élevé.



0
votes

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


8 commentaires

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é) , et il se bloque pour trialkilldle . Pouvez-vous confirmer que certifié.exe 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 sur borne) avec les mêmes paramètres utilisés dans le script ? Une autre chose, vous pouvez essayer exécrtify.exe $ p0 $ p1 ... $ p15 & 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 en arrière-plan Utilisation & IE EXEC cmd args & 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 et cela n'exécutera pas la commande en arrière-plan. Pour exécuter en arrière-plan, vous devez ajouter & et votre commande sera exec cmd args &


J'ai fait que M. Drektz, toujours iam face au même problème



1
votes

 Écran d'invite CMD après avoir exécuté le moteur de test

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


2 commentaires

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



0
votes

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


0 commentaires

0
votes

Veuillez consulter le problème lorsqu'il est exécuté à l'aide d'EXEC exécutable args &


0 commentaires