www.mikrocontroller.net

Forum: Compiler & IDEs Neuer Terminal unter Linux mit C


Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian B. (macdatho)
Datum:

Bewertung
0 lesenswert
nicht 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-ne...

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...

Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: theborg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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";
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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! :-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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().

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fhnv (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
system("xterm -e 'rfcomm connect /dev/rfcomm0 00:XX:XX:XX:XX:XX 1; read'")

Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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


Autor: Thomas Klima (rlyeh_drifter) Benutzerseite
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.