PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : externes programm starten



Ilja
14-09-2001, 22:18
hi.

wie kann ich mittels c++-anweisung(en) ein externes programm starten ohne auf die ergebnisse dieses warten zu müssen. ähnlich dem kdevelop-extras-menü.
evtl. mit fork()? aber wie? ein kleines code-beispiel wär nicht übel.

danke im vorraus &

iGEL
16-09-2001, 00:05
Moin ar!

Mit c++ kenne ich mich zwar nicht so aus, aber da du schon fork() anführst, denke ich, dass du auch nix gegen C-Code haben wirst. Ich habe im letzten Semester eine kleine Shell programmiert, hier der Code der einfachen Version (reicht zum verstehen):



#define _INCLUDE_POSIX_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

/************************************************** ************************
*
* Name: shell
*
* Syntax: shell
*
* Beschreibung: shell ist ein einfacher Kommandointerpreter, der vom
* Benutzer eingegebene Programme ausfuehrt. Die Kommandos
* muessen mit relativem oder absolutem Pfad angegeben
* werden, die PATH-Umgebungsvariable wird nicht beachtet.
* Es werden keine Parameter oder Umgebungsvariablen an das
* Programm uebergeben.
*
************************************************** *************************
*
* Zweck: Die shell kreiert mit fork einen Kindprozess, der sich
* mittels execve selbst durch das ausgefuehrende Programm
* ersetzt.
*
* Prototyp: int main(void);
*
* Parameter: (keine)
*
* Funktionswert: 0
*
************************************************** ************************/
int main()
{
int status, pid, ende;
char befehl[128];

do {

printf("Command: ");
scanf("%127s", befehl);

if ((ende = strcmp(befehl, "exit")) != 0) { /* Nur ausfuehren, wenn
der Befehl != exit */
if ((pid = fork()) != 0) {
wait(&status);
}
else {
execve (befehl, NULL, NULL);
printf("Error: Can't execute %s !\n", befehl);
_exit(0);
}
}
}
while(ende != 0);

return 0;
}


fork() erstellt eine exakte Kopie des laufenden Prozesses, der neue beginnt auch nicht am Anfang, sondern genau bei der fork()-Verzweigung. Wenn fork() den Rückgabewert 0 hat, befinden wir uns im Kindprozess, ist er größer 0, sind wir in Vaterprozess und der Rückgabewert ist die pid des Kindes, wird etwas kleiner 0 zurückgegeben, so konnte kein Kindprozess gestartet werden.

Der Kindprozess muss sich dann mittels execve oder einer Variante davon durch ein anderes Programm ersetzen. Leider ist es wie gesagt kein C++, sondern reines C.

cu Johannes