基于进程间通讯的一个简单的客户端服务器模型
程序代码:
/************************************************************************* > File Name: my_server.c > Author: octopus > Mail: octopus_work. > Created Time: Wed 04 Feb 2015 05:07:45 AM PST ************************************************************************/ #include "my_server.h" //服务器端 void handle(char *src){ int bg; int end; int tmp; bg=0; end=strlen(src)-1; while(bg<end){ tmp=src[bg]; src[bg]=src[end]; src[end]=tmp; bg++; end--; } } void child_main(int fd_cr,int fd_cw){ char msg[1024]; while(memset(msg,0,1024),read(fd_cr,msg,1024)!=0){ handle(msg); write(fd_cw,msg,strlen(msg)); } } int main(int argc,char * argv[] ){ int fd_server; //open fifo char path_name[128]; char fifo_name[128]; char buf[1024]; FILE *fp; int client_pid; char readfile[128]; //client read char writefile[128]; //client write int fd_cr; //read fifo describle int fd_cw ; //write fifo describle memset(path_name,0,128); //memset(fifo_name,0,128); sprintf(path_name,"%s/%s",PATH,FIFO_NAME); mkfifo(path_name,0666); printf("mkfifo over\n"); fd_server=open(path_name,O_RDONLY); open(path_name,O_WRONLY); while(fd_server==-1){ printf("open fail\n"); //open server fifo exit(1); } fp=fdopen(fd_server,"r"); while(memset(buf,0,1024),fgets(buf,1024,fp)!=NULL){ //getpid() sscanf(buf,"%d",&client_pid); printf("%d online\n",client_pid); //client online memset(readfile,0,128); memset(writefile,0,128); sprintf(readfile,"%s/%d_r.fifo",PATH,client_pid); sprintf(writefile,"%s/%d_w.fifo",PATH,client_pid); printf("arrived here\n"); printf("%s\n",readfile); printf("%s\n",writefile); fd_cr=open(writefile,O_RDONLY); /* 问题一: 此处两句通不过,管道打不开,我仔细研究过 fd_cw=open(readfile,O_WRONLY); 不明白为什么程序为卡在这? */ // fd_cr=open(cw,O_RDONLY); printf("open file successful\n"); if(fork()==0){ child_main(fd_cr,fd_cw); close(fd_cr); close(fd_cw); exit(1); } close(fd_cr); close(fd_cw); } memset(fifo_name,0,128); sprintf(fifo_name,"%s/%s",PATH,FIFO_NAME); unlink(fifo_name); return 0; }
/*************************************************************************
> File Name: my_client.c
> Author: octopus
> Mail: octopus_work.
> Created Time: Wed 04 Feb 2015 05:47:09 AM PST
************************************************************************/
#include"my_server.h"
//客户端端
int main(int argc ,char * argv[]){ //shm_key,sem_key
key_t shm_key,sem_key;
int my_shm,my_sem;
char line[1024];
char buf[32];
char readfile[128];
char writefile[128];
char path_name[128];
char fifo_name[128];
int fd_server;
int fd_cr;
int fd_cw;
memset(fifo_name,0,128); //creat r.fifo
sprintf(fifo_name,"%s/%d_r.fifo",PATH,getpid());
sprintf(readfile,"%s/%d_r.fifo",PATH,getpid());
// printf("to here\n");
if(mkfifo(fifo_name,0666)==-1){
printf("mkfifo fail\n");
exit(1);
}
memset(fifo_name,0,128); //create w.fifo
sprintf(fifo_name,"%s/%d_w.fifo",PATH,getpid());
sprintf(writefile,"%s/%d_w.fifo",PATH,getpid());
if(mkfifo(fifo_name,0666)==-1){
printf("mkfifo fail\n");
exit(1);
}
memset(path_name,0,1024);
sprintf(path_name,"%s/%s",PATH,FIFO_NAME);
fd_server=open(path_name,O_WRONLY);
if(fd_server==-1){
printf("open fail\n");
exit(1);
}
// printf("fifo creat successful\n");
memset(buf,0,32);
sprintf(buf,"%d\n",getpid());
write(fd_server,buf,strlen(buf)); //write process id
printf("arrive\n");
/* memset(fifo_name,0,128);
sprintf(fifo_name,"%s/%d_r.fifo",PATH,getpid());
fd_cr=open(fifo_name,O_RDONLY);
if(fd_cr==-1){
printf("open fail \n");
exit(1);
}
// printf("----------\n");
memset(fifo_name,0,128);
sprintf(fifo_name,"%s/%d_w.fifo",PATH,getpid());
fd_cw=open(fifo_name,O_WRONLY);
if(fd_cw==-1){
printf("open fail\n");
exit(1);
}*/
fd_cr=open(readfile,O_RDONLY); I /* 问题二: 被注解的上面几句修改为这两句,管道才能打开 */
fd_cw=open(writefile,O_WRONLY); /* 上面那样打开有问题么?为什么通不过*/
printf("weather arrive here \n ");
pMBUF p;
shm_key=(key_t)atoi(argv[1]);
sem_key=(key_t)atoi(argv[2]);
my_shm=shmget(shm_key,sizeof(MBUF),0666|IPC_CREAT); //creat
my_sem=semget(sem_key,1,0666|IPC_CREAT); //creat lock set signal 1
semctl(my_sem,0,SETVAL,1);
p=(pMBUF)shmat(my_shm,NULL,0);
memset(p,0,sizeof(MBUF));
while(memset(line,0,1024),fgets(line,1024,stdin)!=NULL){
printf("start write\n");
write(fd_cw,line,strlen(line));
// sleep(1);
memset(line,0,1024);
read(fd_cr,line,1024);
printf(" line : %s \n",line);
while(P(my_sem),p->m_flag==1){
V(my_sem);
sleep(1);
}
strcpy(p->m_buf,line);
p->m_flag=1;
V(my_sem);
}
while(P(my_sem),p->m_flag==1)
{
V(my_sem);
sleep(1);
}
strcpy(p->m_buf,"over");
p->m_flag=1;
V(my_sem);
sleep(3);
shmdt(p); //unlink
shmctl(my_shm,IPC_RMID,NULL); //close memery
semctl(my_sem,0,IPC_RMID); //close signal
}
问题描述: 楼主的疑惑之处已在代码中/* 处显示出来,上述并非全部实现代码,恳请各位大神显现神通,这几个问题我已经盯了好长时间。