Forum: PC-Programmierung C/C++ 2 parallel laufende Prozess


von Buns T. (buns)


Lesenswert?

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

von t.b.d. (Gast)


Lesenswert?

such mal nach posix thread ;)

von Andreas K. (a-k)


Lesenswert?

Könnte auch nützlich sein, bei einer solchen Frage das verwendete 
Betriebssystem zu enthüllen.

von Peter (Gast)


Lesenswert?

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.

von Buns T. (buns)


Lesenswert?

Andreas Kaiser wrote:
> Könnte auch nützlich sein, bei einer solchen Frage das verwendete
> Betriebssystem zu enthüllen.

Ich benutze da Linux(Debian)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Buns T. (buns)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Buns T. (buns)


Lesenswert?

Simon K. wrote:
> probiers mit
>
1
> #include <pthread.h>
2
>
>
Jap das habe ich schon :)

Buns

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Buns T. (buns)


Lesenswert?

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

von Buns T. (buns)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.