c - Weird behaviour of fifos on linux -
i'm studying linux fifos , made 2 small c programs communicate through fifo. first 1 acts server, receive pattern , executes command using pattern. second 1 acts client, sends pattern , receive result. want server capable of serving multiple requests, not simultaneously, weird thing after first client served stops although put there infinite loop.
server.c
#include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <signal.h> #include <fcntl.h> void siginthandler(int i){ remove("./fifo1"); remove("./fifo2"); printf("got sigint signal\n"); exit(exit_success); } int main(int argc, char *argv[]){ signal(sigint, siginthandler); int f = mkfifo("./fifo1", 0600); if (f == -1){ perror("unable create fifo1\n"); exit(exit_failure); } f = mkfifo("./fifo2", 0600); if (f == -1){ perror("unable create fifo2\n"); exit(exit_failure); } int fd1 = open("./fifo1", o_rdonly); int fd2 = open("./fifo2", o_wronly); if (fd1 == -1 || fd2 == -1){ perror("unable open fifos\n"); exit(exit_failure); } while (1){ char buf[50]; char pattern[50]; read(fd1, pattern, 50); char command[80] = "ps -e | grep "; strcat(command, pattern); file *result = popen(command, "r"); while (fgets(buf, 50, result)){ write(fd2, buf, 50); //printf("%s", buf); } memset((void *) buf, 0, 50); write(fd2, buf, 50); pclose(result); } remove("./fifo1"); remove("./fifo2"); return 0; }
client.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]){ int fd1 = open("./fifo1", o_wronly); int fd2 = open("./fifo2", o_rdonly); if ((fd1 == -1) || (fd2 == -1)){ perror("unable find fifos"); exit(exit_failure); } char input[50]; printf("give pattern: "); scanf("%s", input); write(fd1, input, 50); char buf[50]; while (read(fd2, buf, 50) == 50){ if (buf[0] == 0){ break; } printf("%s", buf); } return 0; }
when first client closes fifo, server gets eof on fifo, , continues no new data in perpetuity. server has reopen fifo next client. if there multiple clients fifo open concurrently, server not eof until last of clients disconnected (as long there 1 writer, reader — server — ok).
this expected behaviour — or, since weren't expecting it, behaviour should expected.
of course, since code ignores return value read()
, have no idea what, if anything, being read.
the code:
memset((void *) buf, 0, 50); write(fd2, buf, 50);
is curious; why send buffer of 50 0 bytes client? close fifo without sending that.
also note writing on fifo there isn't reader generate sigpipe signal — , aren't handling those. default action sigpipe exit.
Comments
Post a Comment