Правильное соединение клиент-сервер FIFO

Я пытаюсь написать простые клиентские и серверные программы на C, взаимодействующие друг с другом в отдельных терминалах.

Сервер должен создать публичный фифо и ждать клиента. Тем временем клиент создает свой собственный FIFO, через который будет приходить ответ сервера. Задача клиента - отправить серверу имя, созданное очередью, и получить взамен результат команды ls .

Я искал ответ, например: fifo-server-program , example-of-using-named-pipe-in-linux-bash , как отправить простую строку между двумя программами с использованием каналов . Я начал с кода из третьей ссылки и медленно его модифицировал.

Теперь у меня есть клиент, который принимает данные от пользователя, отправляет их на сервер и получает обратно. Но работает только один раз. Понятия не имею почему. Ниже приведено описание основной функции. Буду благодарен за любую помощь.

РЕДАКТИРОВАТЬ: У меня все заработало! : D Коды ниже, может кому поможет.

Код server.c:

#include 
#include 
#include 
#include 
#include 

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:

#include 
#include 
#include 
#include 
#include 

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

7
задан Community 23 May 2017 в 12:17
поделиться