Krautkanal.com

Veröffentlicht am 2017-02-09 10:51:17 in /prog/

/prog/ 9908: Linux-Spezifisches

nerrsoft Avatar
nerrsoft:#9908

Ich habe in einem Buch (!) gelesen, Linux könne nur Prozesse klonen, um neue Prozesse zu schaffen. Ich gehe davon aus, system(char*) ist anders implementiert.

Weiß einer, wo diese Mär her ist, oder irre ich mich und das stimmt doch?

keyuri85 Avatar
keyuri85:#9909

Mir ist gerade eingefallen, dass "system(char*)" den Prozess blockiert. "fork()" und "system()" sieht nach einer Methode aus, die funktionieren dürfte, ein anderes Programm nebenher laufen zu lassen. "system("programmname &")" müsste ich mal ausprobieren. Das "&" ist ein Zeichen, dass der Shell sagt, das Programm soll nebenläufig ausgeführt werden.

syntetyc Avatar
syntetyc:#9910

Die "exec()"-Varianten dürften direkt nebenläufig starten lassen.

javorszky Avatar
javorszky:#9913

Der Liux-Systemaufruf zum Erzeugen von Prozessen ist fork().
Dabei wird das Prozessabbild des aufrufenden Prozesses (Elternprozess) exakt Kopiert. Damit hat der neue Prozess (Kindprozess) den gleichen Code, die gleichen Daten und den gleichen Stack wie der Elternprozess. Der eizige Unterschied ist seine ID. Mit den exec*-Systemaufrufen kannst du das Prozessabbild durch das eines anderen Programmes ersetzen.

Unter WindowsNT gibt es den Systemaufruf CreateProcess der sofort ein neues Prozessabbild erzeugt. Prozesshirarchie gibt es unter WindowsNT übrigens nicht.

Deinem ergänzten Kauderwelsch kann Bernd nichts entnehmen, was genau willst du eigentlich machen?

Da dir aber anscheinend essezielle Grunglagen in Sachen Betriebssysteme zu fehlen scheinen, sei dir "Modern operating Systems" von Arndrew S. Tannenbaum ans Herz gelegt.

fluidbrush Avatar
fluidbrush:#9916

>>9913
Es wird nach execl() noch was ausgegeben. Kann ein off-by-one in exec sein, dürfte aber nicht. Mein Ergebnis sieht komisch aus.

#include <unistd.h>
#include <stdio.h>

int main() {
execl("/bin/echo", "test\n", "mehr test\n")
printf("test_exec\n");
return 0;
}

edobene Avatar
edobene:#9917

>>9916
Bernd, das ist nicht lustig.
Lies die Dokumentation der Funktion [1] und dann Benutze sie richtig.

Bernd hilft ja gerne, aber ein bisschen was musst du schon selber machen. Bernd weiß übrigens noch immer nicht was du vor hast.

iamsteffen Avatar
iamsteffen:#9918

>>9917
Link vergessen:
[1] https://users.cs.cf.ac.uk/Dave.Marshall/C/node22.html#SECTION002220000000000000000

scottgallant Avatar
scottgallant:#9919

>>9918
Danke, der war hilfreich. Jetzt macht das Zeug, was es soll, wie mir scheint.

dmackerman Avatar
dmackerman:#9920

>>9919
Ich tippe es mal ab, damit das letzte abgetippte nicht nicht-funktionierender Code ist:

#include <unistd.h>
#include <stdio.h>

int main() {
execl("/bin/echo", "echo", "test", "mehr test", 0);
printf("test_exec\n");
return 0;
}

Das Kursive und das Fett-Gedruckte hätte ich so nicht erwartet. Es kann aber etwas erzeugten Code sparen, wenn man printf("%d %i %f", ...) ansieht.

tomgreever Avatar
tomgreever:#9921

>>9920
"echo" und ", 0" sind die hervorgehobenen Dinge. Sieht man nicht so gut. Das ", 0" ist als End-Markierung wichtig.

vladarbatov Avatar
vladarbatov:#9923

>>9921
Lieber Andreas,
dass du deine ersten schritte in C gehst freut mich sehr.
Es ist aber nicht notwendig, die Dokumentation von stdlib und unistd hier zu kreutzpfostieren. Das hat keinen Mehrwert. Bitte lass das.

Viel Spaß beim Koten wünscht dir
dein Bernd

Neuste Fäden in diesem Brett: