Unix fifo клиент-сервер - PullRequest
2 голосов
/ 06 мая 2011

Я хочу использовать пару Unix FIFO таким образом, чтобы:

  • клиент отправлял на сервер имя файла, а
  • сервер возвращал клиенту:количество слов, строк и байтов из данного файла.

Не могли бы вы помочь?

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;
}

Я сделал некоторые улучшения, но все равно он не работает должным образом.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

В fork '-данной части сервера перенаправьте стандартный ввод и вывод wc с помощью

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

Затем выполните его с помощью

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

Не выполняйтеt передать файловые дескрипторы в качестве аргументов execl.Он ожидает строки (char const*), а не int.

См. dup2 в стандарте POSIX , чтобы понять, как это работает.

0 голосов
/ 11 мая 2011

Обратите внимание, что wc записывает строки символов в свой вывод.Вы пытаетесь прочитать их, как если бы они были двоичными числами.Это может привести к путанице, особенно если вы не проверяете, что вызовы чтения работали правильно.

На самом деле, общий комментарий - вам нужно проверить еще много системных вызовов.убедитесь, что ваши процессы не блокируются при открытии FIFO.Вы должны быть в порядке;у вас есть процессы, открытые «fifo1» для чтения и записи, а затем «fifo2».Я думаю, это навязывает правильный порядок вещей.

Вы правильно пишете только 4-буквенные имена файлов на конвейере.

...