I am trying to write simple C client and server programs by exchanging with each other in separate terminals.
The server needs to create a public fifo and wait for the client. Meanwhile, the client creates its own fifo, through which the server will respond. The client task sends the server the name created in the queue and returns the result of the ls .
I searched for the answer, for example: fifo-server-program , example-of-using-named-pipes-in-linux-bash , how-to-send-a-simple-string-between-two-programs-using-pipes . I started with the code from the third channel and slowly changed it.
Now I have a client that accepts input from the user, sends it to the server and receives it back. But it works only once. I have no idea why. The body of the main function is below. I will be grateful for any help.
EDIT: I will earn !: D Cheats below, maybe this will help someone.
Server.c code:
#include <unistd.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> 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; }
Client.c Code:
#include <unistd.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> 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; }