#c #linux #client-server #mkfifo
#c #linux #клиент-сервер #mkfifo
Вопрос:
Вышеупомянутую программу я ввел в Linux. По сути, она должна соединять клиент и сервер в отдельных терминалах. Но когда я запускаю их в правильном порядке, т. е.
- Скомпилировать сервер -> запустить сервер
- Скомпилировать клиент — > запустить клиент
Терминалы просто ничего не делают. Она даже не печатает "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 обычно блокируется до тех пор, пока кто-то другой не откроет его тоже, чтобы их можно было подключить. (По крайней мере, по умолчанию — ее можно открыть в неблокирующем режиме, хотя это все усложняет.)