A következo program lefoglalja az 5678-as TCP portot, kiírja annak a sorszámát a képernyore (vagyis az 5678-at), és végtelen ciklusban vár azon a TCP-porton egy kapcsolatra. Ha egy kliens rá akar kapcsolódni, akkor elfogadja a rákapcsolódási kérelmet, majd szül egy gyermek-folyamatot, amely a szokásos (korábban is látott) "szolgáltatást" elvégzi.
A SIGCLD signalt a program ignorálja, így a meghalt gyermek-folyamatok nem "halmozódnak fel" zombi-proceszek formájában.
/* * Pelda arra, hogy hogyan mukodik egy (konkurrens) szerver. * A program vegtelen ciklusban figyel egy adott TCP portot, beolvassa * es a kepernyore irja az onnan jovo byteokat, majd uj kapcsolatra * var. */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <signal.h> #define TRUE 1 main() { int sock, length; struct sockaddr_in server; int msgsock; char buf[1024]; int retval; int i; signal(SIGCLD,SIG_IGN); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("hiba a socket-nel"); exit(1); } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(5678); if (bind(sock, &server, sizeof(server))) { perror("hiba a bind-nel"); exit(1); } length = sizeof(server); if (getsockname(sock, &server, &length)) { perror("hiba a getsockname-nel"); exit(1); } fprintf(stderr,"TCP port:%d\n", ntohs(server.sin_port)); listen(sock, 5); do { msgsock = accept(sock, 0, 0); if (msgsock == -1) perror("hiba az accept-nel"); else { if (fork() == 0) { /* Gyermek processz */ close(sock); do { bzero(buf, sizeof(buf)); if ((retval = read(msgsock, buf, 1024)) < 0) perror("hiba a read-nel"); i = 0; if (retval == 0) fprintf(stderr,"Kapcsolat lezarva\n"); else fprintf(stderr,"String:%s\n", buf); } while (retval != 0); close(msgsock); exit(0); } else { close(msgsock); } } } while (TRUE); close(sock); /* Sosem sullyedunk idaig */ }