Wie zum ausführen von zwei Kind-Prozesse, die gleichzeitig in C?
So, ich bin immer in Nebenläufige Programmierung, aber aus irgendeinem Grund kann ich nicht einmal die basics zu arbeiten. Ich habe eine Datei namens Gabel.c enthält eine Methode main. In dieser Methode main I Gabel zweimal, in die Kind-Prozesse 1 und 2.
In Kind 1, ich drucken Sie das Zeichen 'A' 50-mal.
In Kind 2, ich drucken Sie das Zeichen 'B' 50-mal.
Wenn ich meinem code bekomme ich die Ausgabe AAAAA...AAAABBBBBB....BBBBBB. Aber nie etwas, ABABABABABABAB.... In der Tat, manchmal habe ich sogar BBBBB....BBBBAAAA....AAAAA.
Also warum soll ich dieses Verhalten Auftritt? Vielleicht werde ich darüber völlig falsch.
#include <stdlib.h>
#include <stdio.h>
void my_char(char n) {
write(1, &n, 1);
}
int main() {
int status;
pid_t child1, child2;
if (!(child1 = fork())) {
//first childi
int a;
for (a = 0; a < 50; a++) {
my_char('A');
}
exit(0);
} else if (!(child2 = fork())) {
//second child
int a;
for (a = 0; a < 50; a++) {
my_char('B');
}
exit(0);
} else {
//parent
wait(&child1);
wait(&child2);
my_char('\n');
}
return 0;
}
fork
ist wahrscheinlich nicht das, was die meisten Leute denken, wenn Sie sagen, "concurrent programming"...- Warum? Sorry, ziemlich neu in diesem.
fork
erstellt eine neue single-threaded-Prozess. "Parallelität" in der Regel bezieht sich auf multithreading innerhalb eines einzigen Prozesses.- Ihre Prozesse nichts zu tun, sondern streiten sich um eine Ressource, die Ausgabe-Gerät. Also, wie können Sie gleichzeitig ausgeführt werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind gleichzeitig ausgeführt werden, aber die Verfahren endeten fast sofort nach dem Start. In anderen Worten, Sie sind zu kurz, um tatsächlich bekommen, eine echte überlappung.
EDIT:
Zeit benötigt, um zu starten ein weiterer Prozess ist länger als die Zeit, die es dauert, um Sie auszuführen. Daher die Möglichkeit der überlappung ist gering. (es gibt auch die Pufferung Probleme, die werde ich weglassen)
Müssen Sie jeden Prozess zu tun, mehr als das. Drucken Sie mehr als 50. Drucken von mehr als 10000 wird wohl genug sein.
Ich denke, das ist viel einfacher zu Abbildung wie fork() funktioniert:
...und hier ist die Ausgabe: