Я пытаюсь запустить / остановить платы CAN или обновить их скорость передачи данных с помощью SocketCAN из пользовательского пространства. Мои тесты выполняются на платах PeakSystem и IXXAT USB-to-CAN V1 / V2.
Моей первой попыткой было использовать visudo и включить NOPASSWD для «ip link set …», а затем вызвать «sudo ip link set …» в моем C ++ коде.
Полная линия visudo:
%sudo ALL=(ALL:ALL) NOPASSWD: /bin/ip link set can[0123456789]* type can bitrate [0123456789]*, /bin/ip link set can[0123456789]* up, /bin/ip link set can[0123456789]* down
Затем я попытался использовать возможности Linux, добавив возможности в / bin / ip. Это позволяет мне вызывать «ip link set …» из моего кода C ++, что было даже лучше.
Команда добавления возможностей:
sudo setcap cap_net_raw,cap_net_admin+ep /bin/ip
Но потом я обнаружил libsocketcan это гораздо лучший подход, чем вызов командных строк из C ++. Однако при вызове «can_set_bitrate» или «can_do_start» у меня появляется ошибка «RTNETLINK: операция не разрешена». Но все работает нормально, когда моя программа запускается от имени пользователя root. Другие функции, такие как can_get_state, отлично работают в пользовательском пространстве (на самом деле они возвращают: 4 -> CAN_STATE_STOPPED).
Я пытался добавить возможности в мою программу безуспешно «» sudo setcap cap_net_raw, cap_net_admin + ep ./myprogram «.
Как я могу разрешить моей программе использовать libsocketcan в пользовательском пространстве?
Спасибо за вашу помощь!
sudo setcap cap_net_raw,cap_net_admin+ep your_executable
это решение. Возможно, вам придется скомпилировать с -Wl,-rpath
поэтому ваша программа находит свои общие библиотеки (см. также этот ответ)
Других решений пока нет …