Forum: Compiler & IDEs Neuer Terminal unter Linux mit C


von Alex G. (alex94) Benutzerseite


Lesenswert?

Hallo,
ich habe ein C-Skript das mit Hilfe des system() befehls einige bash 
kommandos ausführen kann. Jetzt würde ich aber gerne einige der bash 
befehle in einem neuen Terminal ausführen. Ich weiß aber nicht wie das 
geht :)

Alex

von Sebastian B. (macdatho)


Lesenswert?

Alex G. schrieb:
> Hallo,
> ich habe ein C-Skript das mit Hilfe des system() befehls einige bash
> kommandos ausführen kann.

Ich nehm an ein c Programm, das kompiliert werden musste... Ein Skript 
wird ja interpretiert.

Vielleicht hilft dir:

http://www.tutorials.de/forum/linux-unix/348599-neues-terminal-fenster-fuer-bash-scripte.html

hier steht wie man ein Fenster für Befehle öffnen kann, vielleicht 
kannst du dir das ja in system() rein flicken. Hier werden dann Skripte 
für die bourne again shell verwendet.

Ich google mal noch ein bisschen danach :-D

Sebastian

P.S. ach ja, hilfreich sind noch Informationen wie z.B. welche konsole 
du verwendest, ob du kde 3.5 oder 4.2 oder gar gnome verwendest, welchen 
befehl du aufrufen möchtest und so weiter...

von Alex G. (alex94) Benutzerseite


Lesenswert?

Vielen dank für deine Antwort.
Sebastian Brendler schrieb:
> P.S. ach ja, hilfreich sind noch Informationen wie z.B. welche konsole
> du verwendest, ob du kde 3.5 oder 4.2 oder gar gnome verwendest, welchen
> befehl du aufrufen möchtest und so weiter...
Ich benutze gnome (Ubuntu9.10) und ich möchte diesen Befehl ausführen:
$ rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1


> Ich nehm an ein c Programm, das kompiliert werden musste... Ein Skript
> wird ja interpretiert.
Du nimmst richtig an :)

Warum ich den Befehl in einem neuen Terminalfenster ausführen will?
Der Grund ist einfach der Befehl belegt den ganzen Terminal und ich 
brauche den Terminal im folgenden für mein C-Programm noch.

von Klaus W. (mfgkw)


Lesenswert?

Dann musst du halt mit system() dein neues Terminal starten.
Je nach Umgebung und Vorliebe system( "xterm ..." ) oder
system( "konsole ..." ) etc.

von theborg (Gast)


Lesenswert?

warum das drive nicht fest einbinden so das es so bald es auftaucht 
automatisch eingebunden wird ?

in der /etc/bluetooth/rfcomm.conf z.b.

rfcomm0 {
        # Automatically bind the device at startup
        bind yes;
        # Bluetooth address of the device
        device 00:00:00:00:00:00;
        # RFCOMM channel for the connection
        channel 1;
        # Description of the connection
        comment "BT-Bus Platine";
}

von Klaus W. (mfgkw)


Lesenswert?

theborg schrieb:
> warum das drive nicht fest einbinden so das es so bald es auftaucht
> automatisch eingebunden wird ?
> ...

Tja Alex, damit hast du auf deine Frage eine erschöpfende Antwort! :-)

von Sven P. (Gast)


Lesenswert?

Unter Unix-Systemen gibt es i.d.R. keinen Mechanismus, aus einem Prozess 
einen zweiten zu starten, wie man es erwarten würde.
Der übliche Weg besteht darin, den aktuellen Prozess mit fork() 
aufzuspalten und einen der beiden Prozesse danach mittels exec*() zu 
ersetzen.

Sinnvoll sind auch pipe(), dup(), dup2() und/oder popen().

von Klaus W. (mfgkw)


Lesenswert?

Das ist richtig, wenn man sich die OS-Seite ansieht.
Ändert aber nichts daran, daß auch unter Unix und Linux in der
C-Lib ein system() ist, in dem letztlich natürlich fork() und
exec() stattfinden.
Ich denke, mit system() kommt der TE zügiger voran.

von fhnv (Gast)


Lesenswert?

>Der Grund ist einfach der Befehl belegt den ganzen Terminal und ich
>brauche den Terminal im folgenden für mein C-Programm noch.

Ist das Starten dieses Befehls mit "befehl &" im Hintergrund keine 
Option?

Gast

von Rolf Magnus (Gast)


Lesenswert?

1
system("xterm -e 'rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1'")

Wenn das Fenster nach Ausführung des Kommandos offen bleiben soll, 
kannst du's auch so schreiben:
1
system("xterm -e 'rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1; read'")

von Alex G. (alex94) Benutzerseite


Lesenswert?

Hi,
vielen Dank für eure Antworten.

Einbinden ist keine so gute Idee, ich werde das Programm auf mehreren 
verschiedenen Rechnern laufen lassen, die auch ständig wechseln.

> system("xterm -e 'rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1; read'")

Das funktioniert schon ganz gut.
Das Problem ist jedoch der rfcomm Befehl muss nebenbei laufen, das heißt 
das C-Programm und der Befehl müssen gleichzeitig laufen. Das C-Programm 
wird nicht fortgesetzt solange der Befehl ausgeführt wird.

von Klaus W. (mfgkw)


Lesenswert?

dann probier doch mal:
1
system("xterm -e 'rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1; read' &")

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

kannst dir ja in deinem Programm die PID des gestarteten Prozesses 
merken, damit du es nachher auch killen kannst.

von Klaus W. (mfgkw)


Lesenswert?

Dann aber nicht mit system, sondern dann muß man fork+exec nehmen

(oder man müsste in den system-Aufruf etwas reinbasteln, was die pid 
liefert)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.