AF_UNIX SOCKET: Могу ли я пройти грандиозную рукоятку между процессами?
Вопрос
Допустим, я создаю socketpair()
и я передаю справиться одного из розетков к порожденному процессу (popen
), сможет ли указанный процесс общаться с родителем?
Примеры, которые я видел, применяются с помощью fork()
который не имеет возможности для моего текущего проекта.
Обновлено: Я попробовал простой тест:
Клиент:
socketpair
с гнездами [0Из использования клиента
posix_spawn
с гнездами1 как аргумент командной строкиКлиент:
write
в розетку ... клиент выходит без какого -либо предупреждения ...
Похоже, есть проблема с этим методом.
Обновлено: Я также нашел это примечание:
Pipes and socketpairs are limited to communication between processes with a common ancestor.
Решение
Страница человека для CERCVE CASTIONS:
File descriptors open in the calling process image remain open in the new
process image, except for those for which the close-on-exec flag is set
(see close(2) and fcntl(2)). Descriptors that remain open are unaffected
by execve().
Поскольку такие функции, как Popen, основаны на Execve, то дескрипторы файлов, которые вы получили от своей функции сокета, должны быть хорошими в обоих процессах, и я не понимаю, почему вы не можете передать дескриптор любым способом, который вам нравится. Я предполагаю, что в этом случае вы хотите преобразовать ее в строку и установить его на STDIN в подпроцесс, который преобразовал бы его обратно в INT, чтобы использовать в качестве дескриптора файла.
Это, безусловно, стоит написать какой -то пробный код.
Другие советы
Да, вы можете передать его дочернему процессу. Хитрость на самом деле в том, что SocketPair () дает вам пару подключенных гнезда - убедитесь, что ребенок держит один, а родитель сохраняет другого (родитель должен закрыть ребенка и наоборот).
Вместо этого в большинстве случаев используется пара труб.