| Autor |
Nachricht |
gpvw100
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.04.2012
Beiträge: 6
|
gpvw100 Mitglied
17:35:53 26.04.2012 Titel: |
Mehrere Prozesse - fork |
Zitieren |
Hallo,
Ich habe gerade mit dem Thema fork angefangen und bin dabei ein Übungsprogramm dazu zu schreiben. Es sollte folgendes tun:
-Nach Eingabe eines Kommandozeilenbefehls sofort zur Eingabe des nächsten Kommandos auffordern.
-Ein neuer Prozess soll dieses Kommando ausführen
-Beim Erzeugen der neuen Prozesse soll deren Prozess-ID durch den Vater ausgegeben werden
-Die Kinder selbst sollen vor dem Start des Kommandozeilenbefehls ihre eigene Prozess-ID ausgeben
-Das ganze soll solange ausgeführt werden, bis man Ctrl-C drückt
Hier mein bisheriger Code:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
int main(void){
while(1){
char befehl[42]; //Char-Array fuer den Eingegebenen Befehl
int ergebniss = 99; //Ergebnisvarriable der Ueberpruefung
pid_t retval;
printf("Bitte geben Sie Ihren Befehl ein: "); //Ausgabe der Eingabeaufforderung
if(scanf("%41s", befehl) < 1){ //Begrenze die Puffernutzung
return 1;
}
retval = fork();
if(retval == 0){
printf("Meine PID (Kind): %d\n", getpid());
if((strcmp("ls", befehl) == 0)){ //Ueberpruefen, ob Befehl ls ist
ergebniss = 0; //Wenn Befehl bekannt setzten der Ergebnisvarriable
}
if((strcmp("ps", befehl) == 0)){ //Ueberpruefen, ob Befehl ps ist
ergebniss = 0; //Wenn Befehl bekannt setzten der Ergebnisvarriable
}
if((strcmp("pwd", befehl) == 0)){ //Ueberpruefen, ob Befehl pwd ist
ergebniss = 0; //Wenn Befehl bekannt setzten der Ergebnisvarriable
}
if(ergebniss != 0){ //Ueberpruefen ob der Befehl gueltig ist
printf("Unbekannter Befehl!\n"); //Wenn nicht Ausgabe von Fehlermeldung
return 1; //Beenden mit Fehler
}else{
execlp(befehl, befehl, NULL); //Ausfuehrung des Befehls, sollte nicht zurueckkehren
return 1; //Falls doch: Fehler
}
}else if(retval == 1){
printf("PID meines Kindes: %d\n", retval);
}else if(retval == -1){
perror("fork");
exit(EXIT_FAILURE);
}
}
} | |
Ich kann so viele Befehle nacheinander eingeben wie ich möchte und sie werden auch alle ausgeführt. Allerdings stimmt etwas mit der Formatierung nicht. Erst wird der Text "Bitte geben Sie Ihren Befehl ein: " ausgegeben, dann die PID des Kindes und dann kann ich in eine neue Leere Zeile meinen Befehl eintippen.
Der Vater sollte aber noch nach dem Erzeugen die PID des Kindes ausgeben und das nach der Eingabeaufforderung direkt das Kind seine PID ausgibt ist auch nicht optimal. Zombies sollen erstmal nicht beachtet werden.
mfg
gpvw100 |
Zuletzt bearbeitet von gpvw100 am 17:38:15 26.04.2012, insgesamt 1-mal bearbeitet |
|
 |
C++ Forumbot
Forumbot
Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 17114
|
C++ Forumbot Forumbot
18:34:09 26.04.2012 Titel: |
|
Zitieren |
|
 |
lagalopex
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.01.2008
Beiträge: 317
|
lagalopex Mitglied
19:28:45 26.04.2012 Titel: |
|
Zitieren |
Aus fork:
| Zitat: | | On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately. |
| C++: | if (retval == -1) {
//fehler
} else if (retval == 0) {
//kind
} else {
//vater mit retval == kind-pid
} | | |
|
|
|
 |
gpvw100
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.04.2012
Beiträge: 6
|
gpvw100 Mitglied
20:54:19 28.04.2012 Titel: |
|
Zitieren |
Erstmal vielend Dank für deine Antwort. Allerdings habe ich den Aufruf doch genau in diesem Format oder nicht? |
|
|
|
 |
SG1
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 2552
|
SG1 Mitglied
21:11:03 28.04.2012 Titel: |
|
Zitieren |
Nein, Du vergleichst auf ==-1, ==0 und ==1, richtig wäre aber ==-1, ==0 und >0. |
|
|
|
 |
gpvw100
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.04.2012
Beiträge: 6
|
gpvw100 Mitglied
01:17:46 01.05.2012 Titel: |
|
Zitieren |
Vielen Dank für die Hilfe, damit hat es funktioniert. Jetzt muss ich nur noch das Problem mit der Fehlerhafte Ausgabe von "Bitte geben Sie Ihren Befehl ein" Lösen. Hat dazu vielleicht auch jemand einen Tipp? |
|
|
|
 |
gary1195
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.04.2008
Beiträge: 181
|
gary1195 Mitglied
07:58:44 01.05.2012 Titel: |
|
Zitieren |
Bevor es weitergeht könntest du kurz sleep aufrufen für eine Sekunde oder so dann wird die Ausgabe nicht "vermischt" (es sei denn der aufgerufene Befehl gibt nach der Wartezeit noch was aus) |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|