linux下c语言多进程文本处理的有关问题

linux下c语言多进程文本处理的问题
这个程序是让client访问server,每次查询一个单词,如果找到,就把其他语言中对应的词显示出来,如果没有找到,可以自己添加进去.

试过用FILE   *   fp操作文本的方法,但是出现了死循环,在系统中打开了无数的新进程.于是改用文件访问原语的方法,解决了死循环的问题,但是不知道文件检索怎么写应该,麻烦各位大侠指条明路.送分60,多谢多谢!!!

下面是源程序,以及字典文件


/*   ======================================   */
//   File:   DictServer.c
/*   ======================================   */

#include   <string.h>
#include   <netinet/in.h>
#include   <netdb.h>
#include   <sys/types.h>
#include   <sys/socket.h>
#include   <arpa/inet.h>
#include   <signal.h>
#include   <errno.h>
#include   <stdlib.h>
#include   <stdio.h>
#include   <time.h>
#include   <sys/stat.h>
#include   <fcntl.h>
#include   <unistd.h>
#include   <sys/wait.h>

#define   BUF_LEN   4096
#define   SPEICHERN   1
#define   NICHT_SPEICHERN   0

int   main()   {
struct   sockaddr_in   server,client;
int   sock,readSize,addressSize;
int   fd;
int   bytes_read;

char   buf[BUF_LEN];
char   tmp[BUF_LEN];
char   *   meldung;

char   *   s;

pid_t   pid;
int   *   status;

int   sav;

server.sin_family   =   PF_INET;
server.sin_addr.s_addr   =   INADDR_ANY;
server.sin_port   =   htons(5678);


if   ((sock=socket(PF_INET,SOCK_DGRAM,0))   <   0)   {
perror( "socket ");
exit(-1);
}

if   (bind(sock,(struct   sockaddr   *)&server,sizeof(server))   <   0)   {   //local   Adresse
perror( "bind ");
exit(-1);
}

do   {
addressSize   =   sizeof(client);
if   ((pid=fork())   <   0)   {
perror( "fork ");
exit(-1);
}
else   if   (pid   ==   0)   {
if   ((readSize=recvfrom(sock,buf,sizeof(buf),0,(struct   sockaddr   *)&client,&addressSize))   ==   -1)   {
perror( "recvfrom ");
exit(-1);
}
buf[readSize]   =   0;

//printf( "my   id(child):   %d\n ",   getpid());
//printf( "my   parent   id:   %d\n ",   getppid());

if   (strstr(buf, "; ")   ==   0)   sav   =   NICHT_SPEICHERN;
else   sav   =   SPEICHERN;

if   ((fd=open( "Dictionary.dat ",   O_CREAT|O_APPEND|O_RDWR,0644))   ==   -1)   {
perror( "Open ");
exit(-1);
}

if   (!sav)   {
while((bytes_read=read(fd,tmp,4096)))   {
if   (bytes_read   <   0)   {
perror( "read ");
exit(-1);
}
}

close(1);
dup(fd);

close(2);
dup(fd);

close(0);
close(fd);

if   (strstr(tmp,buf)   ==   0)   meldung   =   "leer ";
else   meldung   =   "gefunden ";


if   (sendto(sock,meldung,strlen(meldung),0,(struct   sockaddr   *)&client,sizeof(client))   <   0)   {