C: Parents, Childs, PID

lordosiris

Mitglied
C: EXEC Funktion (PID erledigt)

Hallo,

hab hier ein ganzes simples Programm, das macht folgendes:
Es gibt seine PID aus, dann erstellt es eine Variable Anzahl an Child Prozessen. Die Child Prozesse sagen einmal kurz "Hallo, ich bin <PID> und meine Eltern haben die PID <PID>". Danach schließen die sich, der Parents Prozess wartet darauf und beendet das ganze Programm.

So weit so gut, funktioniert alles. Glaub ich zumindest.

Sollte bei der ersten Ausgabe des Eltern Prozesses die PID nicht die selbe sein, wie die jenige, die das Kind dann als die PID seiner Eltern ausgibt?

Bei mir kommt sowas als Ausgabe.
PID der Parents: 1972.
Hallo, ich bin 9924 und meine Eltern sind 9922.

Hoffe, es war verständlich.
 
Zuletzt bearbeitet:
Oh, natürlich.

C:
printf("Hallo, ich habe die PID %d\n", getppid());
    for (i = 0; i < amount; ++i) { 
        pids[i] = fork();
        if (pids[i] == 0) {
            printf("Hallo, ich bin ein Child Process mit der ID %d und meine Parents haben die ID %d.\n", getpid(), getppid());

Werden hald in dem Fall möglicherweise mehrere Child Prozesse erstellt.
 
Danke schön.

Während ich auf eine Antwort gewartet habe, hab ich mir weiterhin Gedanken drüber gemacht und bin dann selbst draufgekommen, dass PPID in dem Fall ja nicht die PID des aktuellen Prozesses ausgeben kann.

Ein Buchstabe und das Ding schreibt gleich einen kompletten quatsch!

Danke an euch 2 :)

Jetzt hab ich noch eine andere Frage:

Gibt es eine Möglichkeit, einen String ohne einen anderen String auszugeben?
Also Beispielsweise habe ich den String "Hallo, ich heiße Hans!" und möchte das ganze ohne "Hans!" ausgeben. "Hans!" steht dabei in einem anderen String.

E:/ danke, hab schon was passendess gefunden!
 
C: exec Funktion

Halli Hallo,

da mein Thread direkt darunter schon als erledigt abgehackt wurde, muss ich jetzt einen neuen aufmachen.

Und zwar komme ich mit der exec Funktion überhaupt nicht zurecht, es gibt zick verschiedene, einen richtigen Unterschied für was man welche verwendet, konnte ich nicht entdecken, leider.

Und zwar ist mein Ziel eine kleine Übergabe der Befehle.

Mein Programm geht auf, gibt ein Zeichen aus (damit der User weiß, es lebt!), wartet auf die Eingabe eines Shell Befehls und führt diesen aus.

Bisher hab ich sowas:

C:
while (strcmp(exit,input) != 0) {
		printf("$ ");
		gets(input);
		strcpy(input2, input); //String kopieren
		command = strtok(input, "-"); //Kommando erstellen
		option = strstr(input2, "-"); // Optionen trennen
	}

Um den Befehl auszuführen dachte ich an sowas:

C:
execvp(command, option);

Gebe ich allerdings "ls -al" ein, passiert garnix.
Lautet meine Eingabe "ls" kommt: A NULL argv[0 was passed through an exec system call.
Abgebrochen.

Das wars.

Und ich komm hier nicht weiter. Wie schon erwähnt, werd ich hier gerade Zwangsbeglückt mit C. Aber ich kanns hald nicht, Google hilft mir momentan auch nicht mehr weiter.
 
da mein Thread direkt darunter schon als erledigt abgehackt wurde, muss ich jetzt einen neuen aufmachen.
Man kann trotzdem reinschreiben,
und mit einem Klick auf das Erledigt setzt du es wieder auf Nein zurück.

Da du ja in den Alten schreiben wolltest hab ich den Beitrag dorthin verschoben
(und das Erledigt schon aufgehoben).


Zur Frage selbst:
Wie genau rufst du execvp auf?
Lass dir die Parameter direkt davor einmal ausgeben.
 
C:
while (strcmp("exit",input) != 0) {
		printf("$ ");
		gets(input);
		strcpy(input2, input); //String kopieren
		command = strtok(input, "-"); //Kommando erstellen
		option = strstr(input2, "-"); // Optionen trennen
		printf("Kommando: %s, Option: %s\n", command, option);
		execvp(command, option);
	}

$ Hallo -al
Kommando: Hallo , Option: -al
$ la
Kommando: la, Option: (null)
$ ls
Kommando: ls, Option: (null)
A NULL argv[0] was passed through an exec system call.
Abgebrochen

Compiler Fehlermeldung:
yash.c:19:3: Warnung: Übergabe des Arguments 2 von »execvp« von inkompatiblem Zeigertyp [standardmäßig aktiviert]
/usr/include/unistd.h:575:12: Anmerkung: »char * const*« erwartet, aber Argument hat Typ »char *«
Kompilierung erfolgreich beendet.

Aber damit anfangen kann ich leider nichts. :(
 
execvp will als zweiten Parameter keinen einzelnen String, sondern ein Stringarray.
Jedes Element davon ein Parameter für das startende Programm.
Und auch, wenns nur ein Parameter ist, muss es trotzdem ein Stringarray sein.

Zusätzlich noch zu beachten: [0] vom besagten Array ist der Programmname/pfad
(obwohl schon im ersten execvp-Parameter mitgegeben)
Und enden muss es mit einem NULL.

C++:
char *params[3];
params[0] = command;
params[1] = options;
params[2] = NULL;

execvp(command, params);
//oder auch, weil gleicher Inhalt
execvp(params[0], params);
 
Danke sehr,
funktioniert jetzt.

Allerdings funktioniert das ganze 1x. Wenn ich den Befehl "ls" eingebe, gibt er es aus und beendet das Programm.

Die Optionen, also z.b. ls -al, da ignoriert er -al.

Warum aber beendet er das ganze nun?

C:
do {
		printf("$ ");
		gets(input);
		strcpy(input2, input); //String kopieren
		command = strtok(input, "-"); //Kommando erstellen
		option = strstr(input2, "-"); // Optionen trennen
		params[0] = command;
		params[1] = option;
		execvp(command, params);
	} while (strcmp("exit",input) != 0);
	
	return 0;
 
Zurück