Проблема: recvmsg (pfd [0], & message, MSG_WAITALL) всегда возвращает -1, а не блокируется? - PullRequest
0 голосов
/ 01 марта 2011

Я создаю сервер, который порождает дочерний элемент при подключении (используя fork), и использую канал, чтобы отправить другой сокет этому дочернему элементу, когда подключается другое подключение. Идея состоит в том, чтобы позволить дочернему процессу управлять двумя подключениями в режим сетевой игры для 2 игроков.

Переменная IPC канала между родителем и потомком - pfd [2].

В основном, в дочернем процессе я recvmsg(pfd[0], &message, MSG_WAITALL) жду, пока 2-й сокет будет передан от родителя.

Однако recvmsg никогда не блокируется и всегда возвращается -1.

Я уже установил pfd [0] в BLOCKINg следующим образом:

// set to blocking pipe
int oldfl;
oldfl = fcntl(pfd[0], F_GETFL);
if (oldfl == -1) {
    perror("fcntl F_GETFL");
    exit(1);
}
fcntl(pfd[0], F_SETFL, oldfl & ~O_NONBLOCK);

Как сделать так, чтобы ребенка блокировали на recvmsg?

Спасибо миллион за любой намек.

1 Ответ

1 голос
/ 01 марта 2011

recvmsg() не работает для труб, а только для розеток. Когда recvmsg() возвращает -1, вы должны проверить значение errno, это, вероятно, EBADF.

Вы можете использовать unix сокеты вместо канала для передачи файловых дескрипторов между процессами.

...