Hallo,
ich verstehe dein Problem nicht ganz. Was meinst du denn z.B. mit "Verbindung speichern"?
Wenn du für dein Projekt UDP verwenden möchtest, dann brauchst du keine RAW-Sockets. Außer du willst das ganze selbst implementieren - würde ich dir eher nicht empfehlen. Bei UDP bekommst du vom Client Daten geschickt und danach besteht im Gegensatz zu TCP keine Verbindung mehr mit dem Client. Wenn du also mit "Verbindung speichern" meinst, dass du die Verbindung mit dem Client erhalten willst, dann nimmst du am besten TCP.
Mit Raw Sockets kannst du Daten direkt an die Netzwerk-Karte schicken - ohne ein Protokoll wie TCP oder UDP zu verwenden. Das wird meisten zum Debugen und entwickeln neuer Protokolle verwendet.
mfg blan
Hallo
Soweit ich die Anforderung verstanden habe wäre es gut mit conditional variablen und mutexen zu lösen. Die Workerthreads legen sich mit pthread_cond_wait so lange schlafen bis der main-thread eine neue Aufgabe bereit hat und dies mit pthread_cond_signal oder pthread_cond_broadcast den Threads mitteilt. Durch den Mutex ist auch der "Auftragsverteiler" gegen gleichzeitige Zugriffe geschützt. Mit sleep kann man nur nach dem Aufwachen permanent nachfragen ob eine Aufgabe da ist oder nicht ... das funktioniert zwar, ist aber IMHO nur in wenige Fällen effizient (außer man benutzt vielleicht spin-locks und atomic flags für ein besonders schnelles und kurze Operationen)
Zur eigentlichen Frage kann ich nur sagen, dass laut doku ein Aufruf von sleep und usleep nur den aktuellen Thread, nicht aber den ganze Prozess beeinflusst. Ich habe bei einer Portierung eines Windows-Programms auf Linux auch immer usleep als "Übersetzung" von "Sleep()" benutzt und das Programmergebnis war - so weit ich es prüfen konnte - identisch -> Andere Threads werden von sleep/usleep nicht beeinflusst.
lg XOR
ausgabe[child] = inbuf;
hier übergibst du pointer auf inbuf auf ausgabe[child].
Um Fehler zu beheben musst du:
1. der ausgabe[child] platz allokieren (realloc oder anderes) oder am anfang sagen (siehe Beispiel)
2. den inhalt kopieren (stichwort memcpy (Beispiel) bzw memmov)
int main() {
char inbuf[MSGSIZE];
char msg[MSGSIZE];
char *ausgabe[2];
char ausg1[MSGSIZE];
char ausg2[MSGSIZE];
ausgabe[0] = ausg1;
ausgabe[1] = ausg2;
int p[2],i;
pid_t pid;
int child = 0;
pipe(p);
pid= fork();
for (child=0;child<2; child++){
if (pid == -1 ) {
perror("fork call"); exit(-1);
}
else if (pid == 0 ) {
printf ("Child %d von PPID %d mit der PID %d.\n",child, getppid(), getpid ());
scanf("%s",msg);
write(p[1], msg, MSGSIZE);
exit(0);
}
else if (pid > 0){
printf ("Parent von %d mit der PID %d.\n",pid, getpid ());
wait((int*)0);
read(p[0], inbuf, MSGSIZE);
memcpy(ausgabe[child], inbuf, strlen(inbuf)+1);
if(child<1){pid = fork();}
}
}
printf("Child 0 sagt: %s \n", ausgabe[0]);
printf("Child 1 sagt: %s \n", ausgabe[1]);
exit(0);
}
und schon hast du folgende Ausgabe:
Child 0 von PPID 10338 mit der PID 10339.
Parent von 10339 mit der PID 10338.
abc
Child 1 von PPID 10338 mit der PID 10345.
Parent von 10345 mit der PID 10338.
123
Child 0 sagt: abc
Child 1 sagt: 123
supertux schrieb:
Um Zombies zu vermeiden, muss man folgendes tun:
pid_t child, realchild;
child = fork();
if(child < 0)
FEHLER;
if(child == 0)
{
child = fork();
if(child < 0)
exit(1);
if(child == 0)
{
/* Kind vom Kind (A): hier läuft dein Programm */
}
exit(child); /* damit init (A) als Vater übernimmt und
liefert pid vom Enkel als exit status. "böser" hack */
}
waitpid(child, &staus, 0);
realchild = WEXITSTATUS(status);
spät, aber doch...
"exit(child)" ist aber ein wahrhaft "böser" hack
er wird nur leider nicht funktionieren. exit akzeptiert nur Werte von 0 bis 255 bzw. nimmt exit den übergebenen wert einfach modulo 256, wenn ich mich richtig erinnere. hier ist ein link der das in etwa bestätigt (also vom ergebnis zumindest; ob dabei modulo gerechnet wird, steht aber nicht dabei):
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_22.html#SEC397
LordJaxom schrieb:
ghjghj schrieb:
INADDR_ANY ist aber bereits vordefiniert und wird nicht über die Leitung versendet, daher braucht man das nicht.
Beim Senden von Daten ist die Endianess natürlich zu beachten.
Auch der Rückgabewert von inet_addr hat bereits korrekte Byte-Order. Beim Befüllen der Struktur sockaddr_in braucht man daher i.A. nur htons für den Port.
Ich habe nie etwas gegenteiliges behauptet. Mit dem Senden von Daten meinte ich: send(...)
Dort muss man je nach Zielsystem(en) und Datentypen entsprechend aufpassen.
siehe "Step-by-step guide" bei http://gcc.gnu.org/wiki/Visibility
Mit anderen Worten, bei jeder Klasse im Header das _API-Define verwenden,
und bei lokalen Klassen das _LOCAL-Define verwenden und dann diese Defines je nach verwendetem Compiler und Export-/Import-Situation definieren --> maximale Flexibilität.
@Supertux, dies löst mein Problem aber nicht.
Wenn ich deinen Lösungsvorschlag benutze kann ich nicht mehr mehrere Timer
gleichzeitig starten. Das hatte ich aber schon im Eingangspost beschrieben.
Mein Ziel ist es die Funktionalität des Programms ohne waitpid beizubehalten und gleichzeitig die Zombies mit Hilfe des waitpid() Befehls zu entfernen.
Ich habe soeben doch noch eine Seite gefunden (sogar auf Deutsch), die Bibliotheken perfekt und verständlich für Einsteiger (wie mich) erklärt:
http://www.oreilly.de/german/freebooks/rlinux3ger/ch132.html
Ich hoffe ich konnte auch anderen helfen
Hallo Greenthumb,
ich hab dlopen() zu Unrecht im Verdacht gehabt.
Die Variante mit Templates war in einem anderen Projekt und ich hatte die Templateklasse wie gewohnt in Definition und Implementation aufgeteilt.
Anscheinend darf man das bei Templateklassen anscheinend nicht.
Jetzt funktioniert es.
Also zumindest mein Beispielprogramm, das ich hier anhängen wollte, im richtigen Projekt macht jetzt ein Destruktor Ärger, aber das gehört hier nicht hin.
Viele Grüße,
Kai
Ich brauch Urlaub.
Zum einen Danke das Du einen Fehler gefunden hast. Das ist natürlich eine Überlegung nicht das ganze Bild abzurufen, sondern nur die benötigten Pixel. Wo bei das in der Summe. Worst Case das ganze Bild erfolglos durchsucht noch länger dauern dürfte.
Danke, damit komm ich schon wieder ein Stück weiter.