Systemaufruf |
Programmfäden |
Globaler Speicher |
select() |
einer |
gemeinsam |
Threads |
mehrere |
gemeinsam |
fork() |
mehrere |
gemeinsam vor fork(), getrennt
nach fork() |
Funktion |
UNIX |
MS-Windows CRT |
Programmdatei im Kindprozess
starten |
fork() und exec() |
_spawn() |
Kind Prozess (Thread) starten |
fork() |
_beginthread() |
Kind Prozess (Thread) beenden |
exit() |
_endthread() |
Pipe erzeugen und Shell Kommando
ausführen |
popen() |
_popen() |
Pipe schließen |
pclose() |
_pclose() |
Gepufferte Ein-/Ausgabe
ermöglichen |
fdopen() |
_fdopen() - nicht für
Sockets |
Schlechte Lesbarkeit |
Gute Lesbarkeit |
if ((connectfd = accept(localfd, NULL,
NULL)) < 0) { perror("remshd.c accept"); continue; } |
connectfd = accept(localfd, NULL,
NULL); if (connectfd < 0) { perror("remshd.c accept"); continue; } |
exit_if(listen(localfd, 5) < 0); | rv = listen(localfd, 5); exit_if(rv < 0); |
while ((len = recv(fd, eingabe,
sizeof(eingabe)-7,0)) > 0)
{ // weitere Anweisungen } |
for (;;)
{ len = recv(fd, eingabe, sizeof(eingabe)-7,0); if (len <= 0) { break; // for Schleife verlassen } // weitere Anweisungen } |
Stark Fehleranfällig |
Wenig Fehleranfällig |
char buf[1024]; items = fread(buf, 1, 1024, fp); |
char buf[1024]; items = fread(buf, 1, sizeof(buf), fp); |
struct sockaddr_in local; bind(localfd, (struct sockaddr *) &local, sizeof(struct sockaddr_in)); |
struct sockaddr_in local; bind(localfd, (struct sockaddr *) &local, sizeof(local)); |
rv = send(ausgabefd, "\003\n", 2, 0); exit_if(rv != 2); |
char etx[] = "\003\n"; rv = send(ausgabefd, etx, strlen(etx), 0); exit_if(rv != strlen(etx)); |
Schlechte Lesbarkeit | Gute Lesbarkeit |
int len; int rv; int items; FILE *fp; char eingabe[1025]; char ausgabe[1024]; for (;;) { len = recv(fd, eingabe, sizeof(eingabe)-1, 0); exit_if(len < 0); if (0 == len) { break; } eingabe[len] = 0; fp = popen(eingabe, "r"); exit_if(NULL == fp); do { items = fread(ausgabe, 1, sizeof(ausgabe), fp); rv = send(fd, ausgabe, items, 0); exit_if(rv != items); |
for (;;)
{ int len; int rv; FILE *fp; char eingabe[1025]; len = recv(fd, eingabe, sizeof(eingabe)-1, 0); exit_if(len < 0); if (0 == len) { break; } eingabe[len] = 0; fp = popen(eingabe, "r"); exit_if(NULL == fp); do { int items; char ausgabe[1024]; items = fread(ausgabe, 1, sizeof(ausgabe), fp); rv = send(fd, ausgabe, items, 0); exit_if(rv != items); |