Я столкнулся с проблемой, которую хотел бы понять больше.
У меня есть приложение 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.