Hallo Leute, ich hoffe, dass jermend mir sagen kann wie ich 2 paralle laufende Prozesse in einem C Programm schreiben kann. Ich will die Information von 2 unterschiedlichen Client gleichzeitig bekommen und arbeiten. Von daher habe ich gedacht dass ich diesem Problem mit 2 paralle laufende Prozesse in einem C Programm lösen kann. Danke für euere Hilfe. Grüße, Buns
Könnte auch nützlich sein, bei einer solchen Frage das verwendete Betriebssystem zu enthüllen.
also genau für den zweck gibt es doch thread - einfach mal bei createthread in der man/hilfe suchen. Aber es geht auch ohne thread, hängt von der art der Anwendung ab. Thread erzeugen einen gewissen overhead.
Andreas Kaiser wrote: > Könnte auch nützlich sein, bei einer solchen Frage das verwendete > Betriebssystem zu enthüllen. Ich benutze da Linux(Debian)
t.b.d. wrote: > such mal nach posix thread ;) Alle Fäden in der Hand Thread Programmierung unter Linux in C und C++ (Teil 1) von Wolfgang Schreiner http://www.risc.uni-linz.ac.at/people/schreine/papers/rt++-linuxmag1/main.html
Ich habe folgenden Code geschriben. Beim Kompile bekomme ich diese Meldung "undefined reference to pthread_create"
1 | #include ...
|
2 | #include "encoding.h" |
3 | socklen_t len3; |
4 | struct sockaddr_in addr_i3; |
5 | socket_t rawsock; |
6 | int main(){ |
7 | /**
|
8 | *create a socket
|
9 | *
|
10 | *transport protokol: IP Protokol
|
11 | */
|
12 | rawsock = create_socket(AF_INET, SOCK_RAW, IPPROTO_TCP); |
13 | printf("create successful a Raw Socket - IP Protokol\n"); |
14 | |
15 | /**
|
16 | *set a socket option
|
17 | */
|
18 | setsockoption(rawsock, IPPROTO_IP, IP_HDRINCL); |
19 | |
20 | /*
|
21 | *connect
|
22 | */
|
23 | addr_i3.sin_family = AF_INET; |
24 | addr_i3.sin_addr.s_addr = inet_addr(IP_I3); |
25 | len3 = sizeof(addr_i3); |
26 | |
27 | printf("waiting for data\n"); |
28 | |
29 | /**
|
30 | *create und start thread
|
31 | */
|
32 | pthread_create(&thread_en, NULL, (void*)encoding, &rawsock); |
33 | |
34 | close_socket(rawsock); |
35 | |
36 | return 0; |
37 | }
|
38 | /*************************************************/
|
hier ist file encoding.h
1 | void encoding(socket_t *sock); |
encoding.c
1 | #include "encoding.h" |
2 | |
3 | void encoding(socket_t *sock){ |
4 | char buf[1024] |
5 | recvfrom(*sock, &buf, 1024, (struct sockaddr*)&addr_i3, &len3); |
6 | |
7 | }
|
und meine makefile CC = /usr/bin/gcc CFLAGS = -Wall -g OBJ = main.o socket.o encoding.o main: $(OBJ) $(CC) $(CFLAGS) -o main $(OBJ) %.o: %.c $(CC) $(CFLAGS) -c $< Ich kann gerade nicht sehe wo der Fehler ist. Ich bin sehr dankbar für jeden Hinweis. Gruß Buns
probiers mit
1 | #include <pthread.h> |
EDIT: Ach quatsch, das hast du ja sicher schon. du musst natürlich die LIB noch hinzulinken, in der die pthread Funktionen liegen. Siehe hier: http://www.c-plusplus.de/forum/viewtopic-var-t-is-39508.html
1 | -lpthread |
zum linken dazugeben.
Simon K. wrote: > probiers mit >
1 | > #include <pthread.h> |
2 | >
|
>
Jap das habe ich schon :)
Buns
Buns Tsuko wrote: > Ich will die Information von 2 unterschiedlichen Client gleichzeitig > bekommen und arbeiten. Von daher habe ich gedacht dass ich diesem > Problem mit 2 paralle laufende Prozesse in einem C Programm lösen kann. Dazu brauchst du nicht unbedingt zwei Prozesse/Threads. Du kannst auch non-blocking sockets verwenden und diese mit select() oder poll() reihum abfragen. Das erspart es dir dich um Synchronisierung von Threads kümmern zu müssen.
Simon K. wrote: > probiers mit >
1 | > #include <pthread.h> |
2 | >
|
> > EDIT: Ach quatsch, das hast du ja sicher schon. du musst natürlich die > LIB noch hinzulinken, in der die pthread Funktionen liegen. > > Siehe hier: > http://www.c-plusplus.de/forum/viewtopic-var-t-is-39508.html > >
1 | -lpthread |
zum linken dazugeben. Danke für den Hinweis. Ich muss beim Makefile nocht linken :) Gruß, Buns
Andreas Schwarz wrote: > Buns Tsuko wrote: >> Ich will die Information von 2 unterschiedlichen Client gleichzeitig >> bekommen und arbeiten. Von daher habe ich gedacht dass ich diesem >> Problem mit 2 paralle laufende Prozesse in einem C Programm lösen kann. > > Dazu brauchst du nicht unbedingt zwei Prozesse/Threads. Du kannst auch > non-blocking sockets verwenden und diese mit select() oder poll() reihum > abfragen. Das erspart es dir dich um Synchronisierung von Threads > kümmern zu müssen. Ja. Aber ich kann das nicht benutzen wenn ich die Information von A nach B und gleichzeitig von B nach A übertrage muss. Oder? Gruß, Buns
Doch, du kannst damit prinzipiell alles machen was du auch mit Threads machen kannst (vorausgesetzt du hast keine langen Berechnungen die preemtiv unterbrochen werden müssen). Du liest/schreibst nur die Daten im Buffer, das Betriebssystem kümmert sich um die eigentliche Übertragung und sagt Bescheid wenn Daten angekommen sind bzw. wieder Platz im Buffer ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.