Сокет блокируется при уничтожении процесса, запущенного с повышенными разрешениями в Linux - PullRequest
0 голосов
/ 03 декабря 2018

Я столкнулся с проблемой, которую хотел бы понять больше.

У меня есть приложение C ++ на компьютере с Linux.Давайте назовем это program1.program1 использует ZeroMQ для связи IPC.Я предполагаю, что слой ZeroMQ имеет мало общего с поведением, но хочу представить все факты.Если я запускаю program1 через терминал без повышенных разрешений, я могу убить его любое количество раз.Я также могу запустить program1 с Eclipse без проблем.

Однако, если я запускаю program1 с повышенными разрешениями:

$ sudo ./program1

и убью его (Ctrl + C), сокет IPC блокируется и недоступен для использования при попытке запустить приложение без повышенных привилегий.Однако, если я перезапущу программу с повышенными правами, она будет работать нормально.

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

Это на отметке?Если да, есть ли способ предотвратить этот тип проблемы в коде или исправить проблему после ее возникновения, не перезагружая весь компьютер?

Обновлено ******

Обновлениечтобы добавить больше информации:

1) Программа действительно завершает работу, когда я нажимаю Ctr + C.Его нельзя найти в системном мониторе, даже если он запускается как sudo.(sudo gnome-system-monitor)

2) Сокет возвращает «адрес уже используется» при создании.

3) В идеале, я бы хотел, чтобы они могли подключаться к каждомудругие, независимо от того, как они управляются.Это не проблема, которую я рассматривал во время разработки, и признаю, что я новичок в Linux и связи IPC.

1 Ответ

0 голосов
/ 03 декабря 2018

Вы сказали это: "сокет IPC".

Полагаю, это не сокет TCP.Если zeromq создает объект IPC System V от имени пользователя root, пользователь не может использовать его повторно, и поэтому возникает ошибка разрешения: объекты IPC не уничтожаются при смерти процесса и имеют права доступа и права пользователя.

Вы можетеперечислите существующие объекты IPC с помощью команды ipcs, удалите их с помощью ipcrm.

О, да - будьте осторожны, чтобы не удалять объекты IPC, не связанные с вашей работой ...

ЕслиЯ не смог угадать, вы можете использовать команду strace, чтобы проверить, какой системный вызов на самом деле не может найти реального виновника.

...