PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : aus C++ ein xterm starten



barton4
29-08-2006, 21:52
Ich will aus einem c++ shell programm das auf xterm läauft ein neues xterm starten wo dann ein programm läuft.
Dann möchte ich mit dem Elternprocess per menu den Kindprocess killen können... oder auch am leben lassen :-)

function fork_irgendwas()
{
int id=fork()
if(id==0){execlp("xterm", "htop(als beispiel)")}
else
{return id}
}

leider geht das nicht so wie ich mir das gedacht habe...Der elternprocess geht einfach weiter und der child process bleibt im hintergrund ohne ein xterm zu starten...

locus vivendi
30-08-2006, 10:54
function fork_irgendwas()
{
int id=fork()
if(id==0){execlp("xterm", "htop(als beispiel)")}
else
{return id}
}
Ist function eine Klasse mit einem Konstruktor der ein int erwartet, oder ein Makro welches int oder so ähnlich wird, oder ein typedef ? Andernfalls währe das kein Ausschnitt eines C++ Programms.


leider geht das nicht so wie ich mir das gedacht habe...Der elternprocess geht einfach weiter und der child process bleibt im hintergrund ohne ein xterm zu starten...
Ich kann nicht erkennen was da falsch läuft, zumindest nicht auf den ersten Blick. Du solltest als erstes Fehlerbehandlung einbauen. Wenn eine der Funktionen einen Fehlschlag anzeigt, dann bist du vielleicht schon schlauer.

Die Manpages (bzw. die Online-Referenz) zu den verwendeten Funktionen hast du durchgelesen, oder?

Und wie immer gilt, die größten Chancen auf eine hilfreiche Antwort hast du wenn du eine komplettest Beispiel postest welches dein Problem reproduziert.

Joghurt
30-08-2006, 11:24
Fork gibt -1 zurück, wenn ein Fehler aufgetreten ist.

barton4
30-08-2006, 11:51
#include <iostream>
using namespace std;
#include <signal.h>

int forkProgram()
{
int id=fork();

if(id==-1)
{
cout<<"error"<<endl;
return -1;
}
else if(id==0)
{
execlp("xterm", "",0);
}
else
{
return id;
}
}




int main()
{
int id;
string buffer;
//hier soll dan xterm startet, mit der id will ich später den process wieder killen...
id=forkProgram();
while(true)
{
cout<<id<<" Soll der Process gekillt werden ja/nein... "<<endl;
cin>>buffer;
if(buffer=="ja")
{
kill(id, 9);
}
}
}

das funktioniert jetzt schon gut :-)
aber ein nebeneffekt hat das, das neue xterm ist nun fokusiert d.h ich muss erst wieder in dass Eltern xterm zurück klicken...

Joghurt
01-09-2006, 20:58
Wie wäre es mit einem Freundlichlichen kill 15 statt 9?
Oder erst 15, ein paar Sekunden warten und dann zur Sicherheit 9.

Dass du umfokussieren musst, kannst du nicht so ohne weiteres umgehen, das ist sache des Windowmanagers.

barton4
02-09-2006, 11:56
oh ja ich änderes auf jeden fall auf 15

was aber noch seltsam ist, als ich statt exe()...system() genomen habe was ja nochmal ein einen process forkt war der erste child prozess auf einmal
als root unter htop angezeigt, der 2te dann wieder unter meinem benutzernahmen...

ob das htop nur falsch anzegit?

RapidMax
04-09-2006, 21:04
Du darfst ruhig auch code-Tags verwenden.

Zu deiner Frage: /bin/sh hat nicht etwa ein suid-Bit? (system() verwendet /bin/sh zum ausführen des Kommando)

Gruss, Andy

barton4
13-09-2006, 21:09
nö bei/bin/sh ist alles normal