首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-21 
linux下c语言多进程文本处理的问题这个程序是让client访问server,每次查询一个单词,如果找到,就把其他语言

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)   {


perror( "sendto ");
exit(-1);
}
}   else   {
printf( "%s\n ",   buf);

char   *   write_status;

if   (write(fd,   "\n ",   1)   <   0)   {
write_status   =   "false ";
if   (sendto(sock,write_status,strlen(write_status),0,(struct   sockaddr   *)&client,sizeof(client))   <   0)   {
perror( "sendto ");
exit(-1);
}
perror( "write ");
exit(-1);
}

if   (write(fd,   buf,   strlen(buf))   <   0)   {
write_status   =   "false ";
if   (sendto(sock,write_status,strlen(write_status),0,(struct   sockaddr   *)&client,sizeof(client))   <   0)   {
perror( "sendto ");
exit(-1);
}
perror( "write ");
exit(-1);
}   else   {
write_status   =   "ok ";
if   (sendto(sock,write_status,strlen(write_status),0,(struct   sockaddr   *)&client,sizeof(client))   <   0)   {
perror( "sendto ");
exit(-1);
}
}
fflush(stdout);
}

exit(0);

}   else   {
//printf( "my   id(parent):   %d\n ",   getpid());
//printf( "my   child   id:   %d\n ",   pid);
wait(status);
}
}   while   (1);

exit(0);
}


/*   ======================================   */
//   File:   DictClient.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>

#define   BUF_LEN   4096

int   main(int   argc,   char   *   argv[])   {
struct   sockaddr_in   server;
int   sock,addressSize;
char   buf[BUF_LEN];
char   tmp[BUF_LEN];
char   write_status[BUF_LEN];
int   readSize;

switch   (argc)   {
case   1:
server.sin_addr.s_addr   =   INADDR_ANY;
server.sin_port   =   htons(5678);
break;
case   3:
server.sin_addr.s_addr   =   inet_addr(argv[1]);
server.sin_port   =   htons(atoi(argv[2]));
break;
default:
printf( "Usage:DictClient   [host   port]   \n ");
}

server.sin_family   =   PF_INET;

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

connect(sock,(struct   sockaddr   *)&server,&addressSize);

while(1)   {
printf( "Abfragen:   ");
scanf( "%s ",   buf);

if   (strcmp(buf, "exit ")   ==   0)   exit(0);



sendto(sock,buf,sizeof(buf),0,(struct   sockaddr   *)&server,sizeof(server));

if   ((readSize=recvfrom(sock,tmp,sizeof(tmp),0,0,0))   ==   -1)   {
perror( "recvfrom ");
exit(-1);
}
tmp[readSize]   =   0;
//printf( "read   from   server:   %s\n ",   tmp);

if   (strcmp(tmp, "leer ")   ==   0)   {
printf( "Wort   %s   wird   nicht   gefunden,   Sie   k&#246;nnen   nun   die   W&#246;rte   einfügen:   \n ",   buf);
printf( "Format:   English;Deutsch;Francais\n ");
scanf( "%s ",   buf);
sendto(sock,buf,sizeof(buf),0,(struct   sockaddr   *)&server,sizeof(server));

if   ((readSize=recvfrom(sock,write_status,sizeof(write_status),0,0,0))   ==   -1)   {
perror( "recvfrom ");
exit(-1);
}
write_status[readSize]   =   0;

if   (strcmp(write_status, "ok ")   ==   0)   printf( "Die   W&#246;rte   werden   gespeichert!\n ");
else   printf( "Fehler!   Die   W&#246;rte   werden   nicht   gespeichert!\n ");

}   else   {
printf( "%s\n ",tmp);
}
fflush(stdout);
}
}


/*   ======================================   */
//   File:   Dictionary.dat
/*   ======================================   */
hello;hallo;Salut
welcome;willkommen;bienvenue
world;Welt;monde
apple;Apfel;pomme
dog;Hund;chien
believe;glauben;croire
pretty;hübsch;joli
assembly;Montage;montage
manufacture;Produktion;fabrique
love;Liebe;amour
germany;Deutschland;Allemagne
conversation;Gespr&#228;ch;colloque
mind;Meinung;avis
transformer;Transformator;transformateur
continent;Kontinent;continent
France;Frankreich;France
write;schreiben;écrire
need;brauchen;nécessiter
ask;fragen;demander
strength;Kraft;vigueur
boy;Junge;gamin



[解决办法]
其实就是根据一定的格式对文件读取,
然后判断获得的内容是否是自己关注的即可

热点排行