Серверная программа FIFO

#c #linux #client-server #mkfifo

#c #linux #клиент-сервер #mkfifo

Вопрос:

введите описание изображения здесь

Вышеупомянутую программу я ввел в Linux. По сути, она должна соединять клиент и сервер в отдельных терминалах. Но когда я запускаю их в правильном порядке, т. е.

  1. Скомпилировать сервер -> запустить сервер
  2. Скомпилировать клиент — > запустить клиент

Терминалы просто ничего не делают. Она даже не печатает "Trying to connect" часть первого printf оператора. В чем здесь ошибка?

Редактировать

Я проверил возвращаемое значение mkfifo , как сказал @parapura rajkumar. Но все равно это остается тем же самым. Вот мой измененный код для сервера.

 if(mkfifo("fifo1",0666)<0) {
  printf("Error");
}
if(mkfifo("fifo2",0666)<0) {
  printf("Error");
}
fflush(stdout);
  

Комментарии:

1. Если вы не собираетесь печатать больше в одной строке с помощью нескольких printf вызовов, рекомендуется завершать printf с новой строки ( n ), поскольку это приведет к удалению выходных данных, которые отображаются в консоли. Тогда вам не нужно fflush .

Ответ №1:

Вы создали взаимоблокировку. Открыто ожидание сервера («fifo1», O_RDONLY) и открыто ожидание клиента («fifo2», O_RDONLY).

Редактировать client.c:

 int writefd = open("fifo1",O_WRONLY);
int readfd = open("fifo2",O_RDONLY);
  

Комментарии:

1. Если быть более точным, открытие fifo обычно блокируется до тех пор, пока кто-то другой не откроет его тоже, чтобы их можно было подключить. (По крайней мере, по умолчанию — ее можно открыть в неблокирующем режиме, хотя это все усложняет.)