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) {
这个程序是让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) {