folgendes kleines Problemchen hätte ich heute anzubieten... Also, ich schreibe gerade ein kleines Programm in C (eigentlich in C++, bitte also nicht gleich über die Syntax wundern, ich oller C# Addict, ich...)
Das Programm soll einfach ein Child abforken, aber der Parent soll dem Client noch etwas mitgeben können.
So sieht der Code aus:
Code: Alles auswählen
int main(int argc, string* argv)
{
static volatile int ppid = -1;
volatile int pid = fork();
if (pid > 0) // Parent
{
try
{
ppid = pid;
}
catch (const exception& e)
{
cout << e.what() << "\n";
}
cout << "PID: " << pid << "\n"; // (1)
}
else if (pid == 0) // Child
{
try
{
while (ppid == -1)
{
usleep(1000);
}
}
catch (const exception& e)
{
cout << e.what() << "\n";
}
for (int i = 0; i < 10; i++) // (2)
{
cout << "Child: " << i << "\n";
usleep(100000);
}
}
else // Error
{
cout << "Error creating the child.\n";
return -1;
}
return 0;
}
So, was der Code tut, ist, die PID ausgeben in der mit (1) markierten Zeile und dann auszusteigen.
Wenn ich alles, was mit der Variablen ppid zu tun hat, auskommentiere, läuft aber plötzlich der Code ab (2).
Und so soll es ja auch sein: Ein Thread für den Parent, weitere für die Children. Nun sollte man davon ausgehen können, dass der Parent-Prozess zuerst abläuft, und in den Children ist eben extra die while-Schleife eingebaut, die so lange warten soll, bis ppid sich von -1 auf einan andere Wert ändert.
So, dass das alles nicht sauber ist, sehe ich selbst. Ich bin aber mit den Feinheiten von fork() nicht so vertraut wie vielleicht einige von euch mit denen von C#. Da würde man das eh ganz anders machen mit async, await und vllt sogar Events.
Was ich an meinem Code eigentlich nicht verstehe, ist folgendes: Okay, der Parent setzt ppid auf pid und steigt dann aus. Währenddessen läuft fork() durch und erzeugt das Child. Da ich ppid als static volatile definiert habe, würde ich erwarten, dass der Compiler sich mit Optimierungen zurück hält und static wörtlich nimmt. In der while-Schleife warte ich, bis sich ppid von -1 auf einan anderen Wert ändert. Wenn nun der komplette Code der Funktion in den fork() geworfen wird, dürfte die while-Schleife ja nie enden, und das Programm sollte hängen. Tut es aber nicht, es steigt einfach aus nach der Ausgabe der PID.
Any help appreciated!