Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Linux/Unix ::  Mehrere Prozesse - fork     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
gpvw100
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.04.2012
Beiträge: 6
Beitrag 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
Beitrag C++ Forumbot Forumbot 18:34:09 26.04.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
lagalopex
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.01.2008
Beiträge: 317
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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)
c++.de :: Linux/Unix ::  Mehrere Prozesse - fork   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.