Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

22.03.2010, 10:15

Bash script from C/C++ programm.

Hallo Leute.

Ich habe ein C/C++ Programm von dem aus ich nun ein Bash-Script aufrufen möchte.
Dies funktioniert ja soweit schon ganz gut. Jedoch möchte ich nun das ganze etwas erweitern.
Das Bash-Script sollte vom C++ Programm gestartet werden. Diese Instanz sollte dann erhalten bleiben. Also kurz gesagt eine Endlosschleife.

Quellcode

1
2
3
4
while [ 1 ]; do
    read cmdline
    echo "line: $cmdline"
done



Nun sende ich über stdin von meinem C++ Programm aus einen Befehl z.B. test1
Der Befehl test1 wird an die stdin geschickt das ist sicher nur read reagiert darauf nicht.

Kann mir nun einer sagen was ich da falsch mache?
Oder ist mein Ansatz komplett falsch.

2

22.03.2010, 20:29

Schickst Du auch einen Zeilenumbruch mit?

4

23.03.2010, 22:35

Versuche bitte mal das:

Quellcode

1
while read -r cmdline; do echo "line: $cmdline"; done
..statt Deines ursprünglichen Scripts.

Wenn Du Dein Ursprüngliches Script ausführtest, kamen dann ganz viel "line:"-Zeilen, ohne weiteren Inhalt oder hast Du das so ausgeführt, dass Du gar keine Ausgabe sehen konntest?

5

24.03.2010, 08:03

Also

Bei meinem Script wartet er einfach auf eine Eingabe. Diese nimmt er aber nur von der Tastatur entgegen. Wenn ich mit echo "blabla" > /proc/processid/fd/1 etwas hin schicke passiert gar nichts. Auch bei alle anderen fd passiert gar nichts.

Ich habe mir nun den read source code etwas angesehen.
Die erstellen ja eine eigene PIPE für die STDIN. Dadurch wird das nicht funktionieren.
Ich habe gesehen das es einen Parameter "-u" gibt. Hiermit kann man den zu horchenden fd angeben.

Also habe ich folgendes Script gebaut.

Quellcode

1
2
3
4
5
6
exec 3<&1
while [ 1 ]; do
   read -u 3 cmdLine
   echo "line: $cmdLine"
done
exec 3>&-


Ich sehe nun den unter /proc/processid/fd den filedescriptor 3.
Wenn ich nun hier auch etwas mit echo hin schicke passiert auch nichts.

Nach langen überlegen/lesen hab ich dann probiert das ganze über ein FIFO file zu lösen.

Quellcode

1
2
3
4
5
6
7
if [ ! -p "/tmp/fifofile" ]; then mkfifo /tmp/fifofile; fi
exec 3</tmp/fifofile
while [ 1 ]; do
   read -u 3 cmdLine
   echo "line: $cmdLine"
done
exec 3>&-


Wenn ich dann etwas mit echo "blabla" >/tmp/fifofile etwas in die Fifo schreibe dann führ er dieses blabla aus! Jedoch passiert dann folgendes.
Sobald ich den ersten Befehl geschickt habe läuft so schnell wie möglich die schleife wieder und wieder durch. Er bleibt einfach nicht mehr beim Read stehen und wartet auf eine Eingabe.

Mit deinem Script ist es das gleiche wie bei meinem ersten Script.

Sollte noch jemand eine Idee haben wäre das toll.

6

24.03.2010, 19:49

Zitat

Original von sarpedon

Quellcode

1
2
3
4
5
6
7
if [ ! -p "/tmp/fifofile" ]; then mkfifo /tmp/fifofile; fi
exec 3</tmp/fifofile
while [ 1 ]; do
   read -u 3 cmdLine
   echo "line: $cmdLine"
done
exec 3>&-


Wenn ich dann etwas mit echo "blabla" >/tmp/fifofile etwas in die Fifo schreibe dann führ er dieses blabla aus! Jedoch passiert dann folgendes.
Sobald ich den ersten Befehl geschickt habe läuft so schnell wie möglich die schleife wieder und wieder durch. Er bleibt einfach nicht mehr beim Read stehen und wartet auf eine Eingabe.
Dann probiere bitte das mal mit der Schleife/Bedingung so aus, wie ich sie angab. Spätestens hier solltest Du einen Unterschied bemerken.

Wenn Du das Script ausführst, benutzt Du auch die richtige Funktion mit den richtigen Parametern? (Bei manchen Funktionen muss man den ersten/nullten Parameter auf den Namen/Pfad der gestarteten Applikation bzw. des Scripts selbst setzen.)

7

25.03.2010, 07:58

Also wenn ich das so mache ohne [ 1 ] soder mit read im while dann bricht er mir das Programm nach dem ersten Befehl einfach ab. (er verlässt die schleife).

8

25.03.2010, 20:52

Das bedeutet dann, dass Du STDIN (ungewollt?) zumachst, nachdem Du dem Programm den ersten Befehl gesandt hast.
"while read ... do" liest solange das Pipe offen ist und kein EOF kommt. (Zumindest ist das bei mir immer so.)
Hier noch ein Paar Beispiele dazu:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
# Folgendes Beispiel gibt nur eine Zeile aus,
# weil das Pipe von echo nach dessen "Programmende" geschlossen wird.
echo 'foo'| while read -r foo; do echo "#$foo#"; done

# Das folgende Beispiel gibt zwei Zeilen aus, damit man sieht,
# dass ein Zeilenumbruch (-e + \n) noch kein EOF oder Ende des Pipes bedeutet
echo -e 'foo\nbar'| while read -r foo; do echo "#$foo#"; done

# Das folgende Beispiel nimmt Tastatureingaben zeilenweise vom
# Benutzer (STDIN der Shell) entgegen, bis der Benutzer die Übermittlung
# irgendwie beendet, z.B. durch senden eines EOF mit Strg+D
while read -r foo; do echo "#$foo#"; done

Dein Programm bricht also die Verbindung zwischen den Befehlen/Zeilen irgendwie ab, vielleicht sendet es ein EOF oder bricht das Pipe einfach ab, indem es den Pointer schließt, oder wie Du das gelöst hast. Da liegt also wahrscheinlich das Problem.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »oziris« (25.03.2010, 20:53)


Thema bewerten