Search code examples
coperating-systemipc

How to chat with client from a server using FIFO with select system call?


Hi there i am trying to make such a program in which the the two fds stdin and fifo monitor by select() and communicate with each other. select() will monitor either fifo ready for reading or stdin.

server.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/select.h>
int main(int argc,char *argv[]){
    int f,fifo_read,fifo_write,status;
    fd_set readset;
    FD_ZERO(&readset);
    char str[512]="start";
    if(argc !=2)
    if(argc != 2){
    printf("\nError: %s required argument [Fifo Name]\n\n",argv[0]);
            exit(EXIT_FAILURE);
    }

    if ((open(argv[1], O_RDWR)) < 0){
        f = mkfifo(argv[1],S_IRWXU);
        if(f<0){
            perror("Error While Creating FIFO ");
            exit(EXIT_FAILURE);
        }
        else
            printf("FIFO Created Successfully...\n");
    }

    while(strcmp(str,"end")!=0){
        fifo_write= open(argv[1],O_WRONLY);
        FD_SET(fifo_read, &readset);
        FD_SET(STDIN_FILENO, &readset);
        status = select(fifo_read+1, &readset, NULL, NULL, NULL);
        if(status==-1){
            perror("Error While Calling select() system call ");
            //exit(EXIT_FAILURE);   
        }
        if(FD_ISSET(STDIN_FILENO,&readset)){
            if(fifo_write<0)
                perror("\nError while writing on pipe ");
            else{
                printf("\nServer>> ");
                scanf("%s",str);
                write(fifo_write,str,strlen(str));
                close(fifo_write);
            }
        }
        fifo_read=open(argv[1],O_RDONLY);
        if(FD_ISSET(fifo_read,&readset)){
            if(fifo_read<0)
                perror("\nError while reading from pipe ");
            else{
                read(fifo_read,str,strlen(str));
                close(fifo_read);
                printf("\nJiya%s",str);
            }
        }
    }
    return 0;
}

client.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/select.h>
int main(int argc,char *argv[]){
    int f,fifo_read,fifo_write,status;
    fd_set readset;
    FD_ZERO(&readset);
    char str[512]="start";
    
    while(strcmp(str,"end")!=0){
        fifo_write= open(argv[1],O_WRONLY);
        FD_SET(fifo_read, &readset);
        FD_SET(STDIN_FILENO, &readset);
        status = select(fifo_read+1, &readset, NULL, NULL, NULL);
        if(status==-1){
            perror("Error While Calling select() system call ");
            //exit(EXIT_FAILURE);   
        }
        if(FD_ISSET(fifo_read,&readset)){
            if(fifo_read<0)
                printf("\nError opening read pipe");
            else{
                read(fifo_read,str,strlen(str));
                close(fifo_read);
                printf("\n%s",str);
            }
        }
        fifo_read=open(argv[1],O_RDONLY);
        if(FD_ISSET(STDIN_FILENO,&readset)){
            if(fifo_write<0)
                printf("\nError opening write pipe");
            else{
                printf("\nClient>> ");
                scanf("%s",str);
                write(fifo_write,str,strlen(str));
                close(fifo_write);
            }
        }
    }
    return 0;
}


Solution

  • Here i Got the Solution :)

    server.c

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <sys/select.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <errno.h>
    
    int main(int argc, char *argv[])
    {
        if(argc != 2){
            printf("\nError: %s required argument [Fifo Name]\n\n",argv[0]);
            exit(EXIT_FAILURE);
        }
        int fd,wr,rd,ret;
        fd_set readset;
        if(mkfifo(argv[1],S_IRWXU)==-1){
            if(errno!=EEXIST)
                perror("Error unable to create FIFO ");
            else
                perror("Error unable to create FIFO ");
            exit(EXIT_FAILURE);
        }
        else
            printf("FIFO created Successfully!\n\n");
        fd = open(argv[1],O_RDWR);
        if(fd==-1){
            perror("Error Failed to open fifo\n");
            exit(EXIT_FAILURE);
        }
        while(!0){
            FD_ZERO(&readset);
            FD_SET(fd,&readset);
            FD_SET(STDIN_FILENO,&readset);
            sleep(1);
            ret = select(fd+1,&readset,NULL,NULL,NULL);
            if(ret==-1){
                perror("Error select() ");
                exit(EXIT_FAILURE);
            }
            char str[512]="";
            if(FD_ISSET(STDIN_FILENO,&readset)){
                //fprintf(stderr, ">> ");
                rd = read(STDIN_FILENO,str,sizeof(str));
                if(rd==-1){
                    perror("Error while reading from fifo");
                    exit(EXIT_FAILURE);
                }
                char temp[512]="Server :: ";
                strcat(temp,str);
                wr = write(fd,temp,sizeof(temp));
                if(wr==-1){
                    perror("Error while writing to fifo ");
                    exit(EXIT_FAILURE);
                }
                continue;
            }
            if(FD_ISSET(fd,&readset)){
                rd = read(fd,str,sizeof(str));
                if(rd==-1){
                    perror("Error while reading from fifo");
                    exit(EXIT_FAILURE);
                }else if(rd==0)
                    continue;
                //fprintf(stderr,"P2: %s\n",str);
                printf("%s\n",str);
                //write(STDOUT_FILENO,str,sizeof(str));
            }
        }
    }
    

    client.c

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <sys/select.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <errno.h>
    
    int main(int argc, char *argv[])
    {
        if(argc != 2){
            printf("\nError: %s required argument [Fifo Name]\n\n",argv[0]);
            exit(EXIT_FAILURE);
        }
        int fd,wr,rd,ret;
        fd_set readset;
        fd = open(argv[1],O_RDWR);
        if(fd==-1){
            perror("Error Failed to open fifo\n");
            exit(EXIT_FAILURE);
        }
        while(!0){
            FD_ZERO(&readset);
            FD_SET(fd,&readset);
            FD_SET(STDIN_FILENO,&readset);
            sleep(2);
            ret = select(fd+1,&readset,NULL,NULL,NULL);
            if(ret==-1){
                perror("Error select() ");
                exit(EXIT_FAILURE);
            }
            char str[512]="";
            if(FD_ISSET(fd,&readset)){
                rd = read(fd,str,sizeof(str));
                if(rd==-1){
                    perror("Error while reading from fifo");
                    exit(EXIT_FAILURE);
                }else if(rd==0)
                    continue;
                //fprintf(stderr,"P2: %s\n",str);
                printf("%s\n",str);
                //write(STDOUT_FILENO,str,sizeof(str));
            }
            if(FD_ISSET(STDIN_FILENO,&readset)){
                //fprintf(stderr, ">> ");
                rd = read(STDIN_FILENO,str,sizeof(str));
                if(rd==-1){
                    perror("Error while reading from fifo");
                    exit(EXIT_FAILURE);
                }
                char temp[512]="Client :: ";
                strcat(temp,str);
                wr = write(fd,temp,sizeof(temp));
                if(wr==-1){
                    perror("Error while writing to fifo ");
                    exit(EXIT_FAILURE);
                }
                continue;
            }
        }
    }
    
    

    and the output is : OUTPUt