Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Tcl/Tk & C] stdout redirecten naar Tcl

Pagina: 1
Acties:

  • roel0
  • Registratie: Maart 2011
  • Laatst online: 16-11 15:52
Gegroet,

Ik heb een c programma waaraan ik nu een Tcl en Tk schil wil toevoegen. Met behulp van Tk heb ik enkel tekstvensters voor de output voorzien.

Nu zoek ik een manier om zonder elke printf functie in C te gaan aanpassen, om stdout van het c programma te doen uitlezen in de Tcl/Tk schil. Bij mijn weten is er geen manier om de Tcl_linkVar functie te gebruiken voor een dergelijke file pointer.

In het begin was mijn schil nog een apart progje , dat het c programma inlaadde, toen handelde ik de tekst als volgt af:

code:
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
proc runP {cmd} {
    output command $cmd
    set f [open "| $cmd" r]
    fconfigure $f -blocking false
    fileevent $f readable  [list handleFileEvent $f]
}

proc closePipe {f} {    
    fconfigure $f -blocking true
    if {[catch {close $f} err]} {
        output error $err
    }
}

proc handleFileEvent {f} {
    set status [catch { gets $f line } result]
    if { $status != 0 } {
        output error $result
        closePipe $f

    } elseif { $result >= 0 } {
        # print output naar Tk venster
        output normal $line

    } elseif { [eof $f] } {
        # EOF
        closePipe $f

    } elseif { [fblocked $f] } {
       
    }
}


Maar nu wordt de Tcl schil dus door het C programma ingeladen, waarna de Tcl zorgt dat bepaalde c functies geladen worden adhv de input.
Iemand enig idee hoe ik dit het beste oplos?

Alvast bedankt!

  • Gleighton
  • Registratie: November 2008
  • Niet online
stdout inlezen doe je door de C stdout te koppelen aan de stdin van je applicatie. Onder linux doe je dat meestal met een pipe in de shell ( '|' ). Zo kun je de output van de ene applicatie koppelen aan de input van de andere applicatie.

  • roel0
  • Registratie: Maart 2011
  • Laatst online: 16-11 15:52
Gleighton schreef op donderdag 06 november 2014 @ 13:55:
stdout inlezen doe je door de C stdout te koppelen aan de stdin van je applicatie. Onder linux doe je dat meestal met een pipe in de shell ( '|' ). Zo kun je de output van de ene applicatie koppelen aan de input van de andere applicatie.
Ja, ik ben bekend met die techniek. Maar dit is in dit geval niet toepastbaar.

Een mogelijke oplossing is dat ik de printf functie herdefineer:

code:
1
2
3
4
5
6
7
8
void _printf ... {
     printf
     Tcl_setVar..
}

in het tcl bestand:

trace add variable  ... { puts variable }


maar dit wil dus zeggen dat ik elke printf functie moet vervangen door _printf, hier ben ik niet meteen en fan van dus ik hoop dat er een soortgelijke oplossing is als Tcl_linkvar maar dan voor een filepointer als stdout.