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önnen nun die Wö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örte werden gespeichert!\n ");
else printf( "Fehler! Die Wö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ä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
[解决办法]
其实就是根据一定的格式对文件读取,
然后判断获得的内容是否是自己关注的即可