Дочерняя запись в файловых дескрипторах, созданных в parent после fork

0

У меня есть родительский процесс, который слушает входящие соединения в сокете и после принятия клиента. Он передаст дочернему файлу описательный файл и некоторую другую дату (через именованный канал).

С этого момента дочерний процесс будет предоставлять обслуживание клиенту, а родитель продолжает слушать новых клиентов.

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

Так является ли это причиной неудачи записи? Есть ли какой-либо возможный способ для использования этими файловыми дескрипторами для ребенка?


Решение
Как было упомянуто в ответе Лореба, невозможно достичь желаемого результата таким образом. Я сделал временное исправление, используя другой канал, чтобы направить ответ от дочернего к родительскому. Поскольку дескрипторы файлов принадлежат родительскому элементу, он может перенаправлять ответ клиенту через сокет.

  • 0
    почему вы не создаете сокет в родительском процессе, чтобы файловый дескриптор был общим для родительского и дочернего процессов
  • 0
    @Abhiteshkhatri, потому что мои клиенты будут продолжать подключаться после того, как разветвление выполнено, а файловые дескрипторы, созданные после разветвления, не будут разделены между родителем и потомком.
Показать ещё 2 комментария
Теги:
process
fork
file-descriptor

2 ответа

0
Лучший ответ

Для передачи файлового дескриптора вам нужны сокеты AF_UNIX, а не именованные каналы. Вам понадобится sendmsg (3), который безумно странно использовать, поэтому вам лучше искать пример в Интернете - например, io_passfd в libowfat.

Изменение: в случае, если кто-то наткнется на этот ответ, не используйте клиент/сервер AF_UNIX, используйте socketpair (2)

  • 0
    Спасибо за ваш ответ. Поэтому, основываясь на вашем ответе, передать дескриптор файла не так просто, как просто передать целочисленное значение потомку. Для этого задания, над которым я работаю, невозможно использовать системный вызов sendmsg (). Я думаю, что мне нужно сделать некоторые изменения здесь. Еще раз спасибо.
  • 0
    Да, это не так просто; если вам интересны подробности, есть несколько хороших объяснений в разделе «Связанные» справа.
0

Возможно, вам стоит попробовать закрыть и снова открыть этот FD.

  • 0
    Файловый дескриптор принадлежит активному соединению с сокетом, поэтому я думаю, что это не так просто, как закрыть его в родительском и открыть его в дочернем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню