Сторона программы «Сервер»:
#define RESP_FIFO_NAME "response"
/* Global Variables */
char *cmdfifo = CMD_FIFO_NAME; /* Name of command FIFO. */
char *respfifo = RESP_FIFO_NAME; /* Name of response FIFO. */
int main(int argc, char* argv[]) {
int infd, outfd; /* FIFO file descriptors. */
... // blah blah other code here
/* Create command FIFO. */
if (mkfifo(cmdfifo, FIFO_MODE) == -1) {
if (errno != EEXIST) {
fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", CMD_FIFO_NAME);
exit(1);
}
}
/* Create response FIFO. */
if (mkfifo(respfifo, FIFO_MODE) == -1) {
if (errno != EEXIST) {
fprintf(stderr, "Server: Couldn’t create %s FIFO.\n", RESP_FIFO_NAME);
exit(1);
}
}
/* Open the command FIFO for non-blocking reading. */
if ((infd = open(cmdfifo, O_RDONLY | O_NONBLOCK)) == -1) {
fprintf(stderr, "Server: Failed to open %s FIFO.\n", CMD_FIFO_NAME);
exit(1);
}
/* Open the response FIFO for non-blocking writes. */
if ((outfd = open(respfifo, O_WRONLY | O_NONBLOCK)) == -1) {
fprintf(stderr, "Server: Failed to open %s FIFO.\n", RESP_FIFO_NAME);
perror(RESP_FIFO_NAME);
exit(1);
}
Программа выводит вывод:
Server: Couldn’t create response FIFO.
Я очень мало понимаю в FIFO, так как мой профессор этому не учил. Это все, что я смог понять, читая его примеры и конспекты лекций. Я пробовал без флага O_NONBLOCK, но это просто приводит к зависанию программы, поэтому это необходимо. Я не понимаю, почему FIFO чтения в порядке, но FIFO записи не открывается.
mkfifo()
, в сообщении об ошибке, то естьrespfifo
, а неRESP_FIFO_NAME
. Какие FIFO существуют в текущем каталоге (программы при ее запуске)? Вы уверены, что хотите включить в имя FIFO угловые скобки (или это сообщение об ошибке из другой версии кода)? Вы можете включить в выводerrno
иstrerror(errno)
; это помогло бы диагностировать проблему (EEXIST против EPERM против ...). - person Jonathan Leffler   schedule 06.05.2013perror
илиstrerror
, чтобы узнать точную ошибку. - person Thomas Ruiz   schedule 06.05.2013RESP_FIFO_NAME
— макроконстанта препроцессора#define
. Я добавлю это сейчас. Я предположил, что это не имеет значения, поскольку это был просто строковый литерал с прямой заменой текста. Да, я сейчас воспользуюсь perror и посмотрю, в чем реальная проблема. - person ICantNameMe   schedule 06.05.2013perror(RESP_FIFO_NAME)
выводит<RESP_FIFO_NAME>: No such device or address
, что, по-видимому,ENXIO
- person ICantNameMe   schedule 06.05.2013mkfifo(2)
в Mac OS X. Вы выполняли какие-либоchdir()
операции? Я вижу, что удаление угловых скобок не меняет результат. Что такоеFIFO_MODE
? Команда FIFO уже существует? - person Jonathan Leffler   schedule 06.05.2013FIFO_MODE
это0644
=rw-r--r--
. Я вообще не использовал никакихchdir
, все файлы, с которыми я имею дело, находятся в одном каталоге. Я только что создалcmdfifo
вверху файла main. Он может существовать уже из предыдущих исполнений программы. Если я сдвину командуopen
дляrespfifo
как можно ниже, вместо этого я получу ошибкуread(infd, msgbuf, MSGSIZE+1) == -1
, которая возвращаетResource temporarily unavailable
из вызоваperror
. - person ICantNameMe   schedule 06.05.2013No such device or address
, затем, если я запущу его снова, не удаляя файл FIFO, я получаю ошибкуResource temporarily unavailable
. - person ICantNameMe   schedule 06.05.2013