У меня есть родительский процесс, который слушает входящие соединения в сокете и после принятия клиента. Он передаст дочернему файлу описательный файл и некоторую другую дату (через именованный канал).
С этого момента дочерний процесс будет предоставлять обслуживание клиенту, а родитель продолжает слушать новых клиентов.
Моя проблема в том, что когда я пытаюсь писать в дескрипторах файлов в дочернем процессе, я получу ошибку (дескриптор Bad файла) и запись не удалась. Я предполагаю, что, поскольку эти файловые дескрипторы создаются после fork, ребенок не может просто использовать их, и они принадлежат только родительскому процессу.
Так является ли это причиной неудачи записи? Есть ли какой-либо возможный способ для использования этими файловыми дескрипторами для ребенка?
Решение
Как было упомянуто в ответе Лореба, невозможно достичь желаемого результата таким образом. Я сделал временное исправление, используя другой канал, чтобы направить ответ от дочернего к родительскому. Поскольку дескрипторы файлов принадлежат родительскому элементу, он может перенаправлять ответ клиенту через сокет.
Для передачи файлового дескриптора вам нужны сокеты AF_UNIX, а не именованные каналы. Вам понадобится sendmsg (3), который безумно странно использовать, поэтому вам лучше искать пример в Интернете - например, io_passfd в libowfat.
Изменение: в случае, если кто-то наткнется на этот ответ, не используйте клиент/сервер AF_UNIX, используйте socketpair (2)
Возможно, вам стоит попробовать закрыть и снова открыть этот FD.