Befehl ausführen/stoppen über Tastatureingabe

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    möchte über die Tastureingabe einen Befehl ausfühern und jeder Zeit beenden können.

    Starten funktioniert mit

    Code
    system()

    danach kann man den Befehl aber nicht mehr stoppen.

    Habe mir dafür einen Code entworfen:


    Wenn ich auf q drücke passiert nichts, es kommt auch kein "closed". Wie kann ich dann auf dann das gestartete Programm wieder schliessen?

    Einmal editiert, zuletzt von Cool_pi (29. März 2015 um 01:25)

  • Kommt jetzt halt entscheidend darauf an, was in deinem "close_project.sh" Skript steht - das zeigt meine Glaskugel leider nicht. :)

    Du startest Deine Skripte als eigenständige Prozesse, somit sind sie erstmal von dem Prozess, wo Du Deine Eingaben machst, abgekoppelt.

    Beenden kannst Du so einen abgekoppelten Prozess z.B. mit "kill <ProzessID>" oder auch "killall <name>" - von weiteren Varianten jetzt erstmal abgesehen.

    "close_project.sh" mit '&', also ebenfalls als eigenständiger Prozess gestartet, macht sehr wahrscheinlich kaum Sinn. Besser ohne '&' starten, da das Beenden ja vermutlich ruck-zuck selbst beendet ist.

    Nachdem mit "getchar" solange gewartet wird, bis eine Taste gedrückt wird, kannst du Dir "delay(100)" sparen, macht keinen Sinn. Rein optisch würden entsprechende Einrückungen sich auch gut machen, also z.B. so:

    Wäre dann nicht nur für Dich bereits auf den ersten Blick überschaubarer. ;)
    Gruß, mmi

  • Habe versucht da noch

    Code
    screen


    einzubauen. [/code]

    wird mir angezeigt

    Code
    No Sockets found in /var/run/screen/S-pi.
  • Hallo Cool_Pi,

    warum Du mich mit privaten Nachrichten eindeckst, obwohl ich in meiner Signatur ausdrücklich geschrieben habe: Kein Support über PN! entzieht sich meiner Kenntnis.

    So schreibst Du heute per PN:

    Zitat
    Code
    case 'a':
        serialPuts(uart_device, "Programm startet");
        system("/home/pi/project/A.py &");
        break;
    case 'b' :
        serialPuts(uart_device, "Programm B startet")
        system("/home/pi/project/B.sh &");
        break;


    Code
    case 'a':
        serialPuts(uart_device, "Programm startet");
        system(" screen -AmdS sitzung 1 /home/pi/project/A.py &");
        break;
    case 'b' :
        serialPuts(uart_device, "Programm B startet")
        system("screen -Amds sitzung 1 /home/pi/project/B.sh &");
        break;


    Mach mal Folgendes

    compiliere das Programm mit derartig geschickt-durchdachten Optionen, dass der Quellcode nicht gleich wieder gelöscht wird und dann gibst Du abwechselnd beliebig

    Code
    a

    und

    Code
    q

    auf der Tastatur ein.

    Auf dem Bildschirm müsste dann sowas erscheinen wie

    Code
    A
    Q
    Q
    A
    A        
    A
    Q
    ...

    Wenn das der Fall ist, dann ist das verwendete Konstrukt korrekt.

    Dann setzt Du wieder die Zeilen ein, in denen Du die beiden Skripte aufrufst.

    Wenn dann allerdings Fehler kommen, dann liegt es an Deinen Skripten. Diese solltest Du hier posten.


    Jedenfalls hat Dir von Dir gepostete Fehlermeldung nichts mit dem C-Program zu tun - sondern mit den Skripten, die aufgerufen werden.


    Beste Grüße

    Andreas

    Hallo Cool_Pi,

    dann hast Du eine weitere PN geschrieben:

    Compilieren und starten, die vorgesehenen Tasten eingeben, die dann auf dem Bildschirm angezeigt werden. Erscheinen keine Fehler, dann ist dieses Konstrukt in Ordnung. Dann baust Du die system-Sachen wieder ein. Kommen dann Fehlermeldungen, dann liegt es an den per system() aufgerufenen Skripten.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (12. Oktober 2017 um 21:21)

  • Habe folgendes probiert :
    a.sh

    Bash
    #!/bin/sh
    echo " Taste wurde gedrückt "
    slleep 5;
    echo "Fertig_a"

    b.sh

    Bash
    #!/bin/sh
    kilall a.sh
    echo " Taste wurde gedrückt "
    slleep 5;
    echo "Fertig_b"

    und dann

    Funktioniert. Drücke ich A, kommt auch die Meldung, dass Taste gedrückt wurde und drückte ich b wird dann a.sh gekillt.

    Einmal editiert, zuletzt von Cool_pi (29. März 2015 um 15:29)

  • 'slleep' gibt es nicht ebenso wenig wie 'kilall' :-/

    ..immer dieses copy&paste von Fehlern..


    Ich bezweifle - oder hoffe es zumindest - das dieses "es funktioniert" nicht Sinn und Zweck der Frage war/ist :s Ein bash Script zu nutzen was den anderen Befehl beendet ist eine extrem unsaubere und gepfuschte Programmierweise!

    system() blockiert das C++ Programm solange wie der darin befindliche Befehl ausgeführt wird. Würde also dein a.sh Script vorher ausgeführt und länger als nur 5 Sekunden laufen, kann dein C++ Programm dies nicht mithilfe b.sh beenden!
    Was du also brauchst ist das "a" Programm/Script im Hintergrund auszuführen, dir die PID zu merken und beim drücken der "b"-Taste dann zu prüfen ob eine a-PID existiert, wenn ja diese zu beenden und erst dann das "b"-Programm/Script auszuführen

  • Hallo Cool_Pi,

    so funktioniert es garantiert nicht.

    Mal abgesehen von Fehlern wie slleep und kilall wird das Programm nie über den auruf von a.sh.

    Hast Du das Programm nochmals abgetippt und ein paar falsche Tasten getroffen - oder macht sich Copy & Paste bei Dir selbständig?


    Dein Programm wartet darauf, dass das Skript a.sh zurückkehrt.

    Erst danach reagiert Dein Prpogramm auf weitere Eingaben.

    So hast Du es zumindest hier gepostet.

    Ich kann mnichj dunkel entsinnen, dass Dir früher schon einmal vermittelt wurde, den hier

    Code
    &

    einzubauen, damit das Programm weiter läuft und das Skript parallel laufen kann.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Ja,

    Code
    &

    war dabei, habe mal wieder die falsche Variante des Codes gepostet.

    Code
    sleep und killall

    sind im Code richtig geschrieben. Habe den geposteten Code dann nochmal editiert und falsch geschrieben.

    Der ursprüngliche Code also der hier:


    wurde nur um eine Kleinigkeit verändert und lässt sich nicht mehr mit Tastatur richtig steuern.

    Vorher habe ich den Code für eine UART Ansteuerung ( vom PC aus) benutzt und es hat wunderbar funktioniert.

    Der Code hatte nur zusätzlich die Zeilen:

    Code
    int press_key_device =  serialOpen("/dev/ttyAMA0", 115200);
               char press_key;
               while(1) {
               press_key =  serialGetchar(press_key_device); 
               ......

    Der Rest war gleich und wie gesagt alles hat funktioniert.

    Einmal editiert, zuletzt von Cool_pi (29. März 2015 um 16:43)

  • Da gibt es nur Beispiele mit printf(" Prozess gestartet oder nicht gestartet") oder so was;

    Finde keine Beispiele, wie man damit Programme aufruft und beendet.
    Ein kleines Beispiel wie man damit ein Programm startet und schließt wäre nicht schlecht.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!