Proper FIFO client-server connection

I'm trying to write simple client and server C programs, communicating with each other in separate terminals. The server has to create a public fifo and wait for the client. Meanwhile the client is creating his own fifo through which the server's response will come. The task of the client is sending the server a name created by the queue and get in return the result of the `ls` command. I did search for an answer, for example: [fifo-server-program][1], [example-of-using-named-pipes-in-linux-bash][2], [how-to-send-a-simple-string-between-two-programs-using-pipes][3]. I started with the code from the third link and slowly modified it. What I've got now, is a client taking input from the user, sending it to the server and receiving it back. But it only works once. I have no idea why. The body of main function is below. I will be grateful for any help. **EDIT:** I got it working! :D The codes are below, maybe it will help someone. The server.c code: #include #include #include #include #include int main(int argc, char* argv[]) { int fds[2]; char tab[BUFSIZ]; int fd, n; char *myfifo = "/tmp/serwer"; char *myfifo2 = "/tmp/client"; pipe(fds); mkfifo(myfifo,0666); while(1) { fds[0]=open(myfifo2,O_RDONLY); fds[1]=open(myfifo,O_WRONLY); read(fds[0],tab,BUFSIZ); if (strcmp("klient",tab)==0) { printf("Od klienta: %s\n",tab); fd=open(tab,O_WRONLY); if(fork()==0) { dup2(fds[1],1); close(fds[1]); execlp("ls","ls","-l",NULL); close(fds[0]); close(fds[1]); } else { dup2(fds[0],0); n = read(fds[0],tab,BUFSIZ); write(fd,tab,n); close(fds[0]); close(fds[1]); } } memset(tab, 0, sizeof(tab)); close(fd); close(fds[0]); close(fds[1]); } unlink(myfifo); return 0; } The client.c code: #include #include #include #include #include int main(int argc, char* argv[]) { int fds[2]; char *myfifo = "/tmp/serwer"; char *myfifo2 = "/tmp/client"; mkfifo(myfifo2,0666); fds[0]=open(myfifo,O_RDONLY); fds[1]=open(myfifo2,O_WRONLY); char tab[BUFSIZ]; memset(tab, 0, sizeof(tab)); write(fds[1],"klient",6); perror("Write:"); //Very crude error check read(fds[0],tab,sizeof(tab)); perror("Read:"); // Very crude error check printf("Odebrano od serwera: %s\n",tab); close(fds[0]); close(fds[1]); unlink(myfifo2); return 0; } [1]: [2]: [3]:
It's not apparent from this code. Have you gotten the ls output working or are you just sending small msgs? The usual pitfall in this scenario is that you deadlock i.e. server is waiting for input while client is waiting for input. They wait forever because no one is sending anything.

以上就是Proper FIFO client-server connection的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » CSS3 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准