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 */
}