Radu Stejerean
Radu Stejerean

Reputation: 345

Unix fifo client to server

I want to use a pair of Unix FIFOs in such manner that:

Could you please help?

client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int nr,s2c,c2s,c,d,e;
char a[20];

c2s=open("fifo1",O_WRONLY);
s2c=open("fifo2",O_RDONLY);

printf("give file name \n");
scanf("%s",a);

nr=strlen(a);

write(c2s,&nr,sizeof(int));
write(c2s,&a,sizeof(nr));

read(s2c,&c,sizeof(int));   
read(s2c,&d,sizeof(int));
read(s2c,&e,sizeof(int));

close(c2s);
close(s2c);

return 0;
}

server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int nr,s2c,c2s,c,d,e;
    char a[20];
    FILE* f;

    c2s=open("fifo1",O_RDONLY);
    s2c=open("fifo2",O_WRONLY);

    read(c2s,&nr,sizeof(int));
    read(c2s,&a,sizeof(nr));    

    f=fopen(a,"r");

    if(fork()==0) 
    {
        printf("result is: \n");
        execl("/usr/bin/wc","wc",c,d,e,NULL);
    }
    wait(0);

    write(s2c,&c,sizeof(int));
    write(s2c,&d,sizeof(int));
    write(s2c,&e,sizeof(int));

    close(c2s);
    close(s2c);

    printf("\n FINISH \n");

    return 0;
}

I have done some improvements but still it doesn't work properly.

Upvotes: 2

Views: 1365

Answers (2)

Jonathan Leffler
Jonathan Leffler

Reputation: 753505

Note that wc writes strings of characters to its output. You are trying to read them as if they are binary numbers. This will lead to confusion - especially as you do not check that the read calls worked correctly.

Actually, general comment - you should check many more of your system calls.

You also have to ensure that your processes do not block when opening the FIFOs. You should be OK; you have the processes open 'fifo1' for reading and writing, and then 'fifo2'. I think that forces a correct order on things.

You only write 4-letter file names correctly on the pipe.

Upvotes: 0

Fred Foo
Fred Foo

Reputation: 363507

In the fork'ed part of the server, redirect the standard input and output of wc with

dup2(c2s, STDIN_FILENO);
dup2(s2c, STDOUT_FILENO);

Then exec it with

execl("/usr/bin/wc", "wc", NULL);

Don't pass the file descriptors as arguments to execl. It expects strings (char const*), not int.

See dup2 in the POSIX standard to understand how this works.

Upvotes: 1

Related Questions