Я пытаюсь написать простые клиентские и серверные программы на 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;
}