gpt4 book ai didi

c++ - 使用 libsocketcan 从用户空间启动/停止 CAN 板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:42 26 4
gpt4 key购买 nike

我正在尝试启动/停止 CAN 板或使用来自用户空间的 SocketCAN 更新它们的波特率。我的测试是在 PeakSystem 和 IXXAT USB-to-CAN V1/V2 板上进行的。

我的第一次尝试是使用 visudo 并启用 NOPASSWD 以“ip link set ...”,然后在我的 C++ 代码中调用“sudo ip link set ...”。完整的 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

然后,我通过向/bin/ip 添加功能来尝试使用 Linux 功能。这让我可以从我的 C++ 代码中调用“ip link set ...”,这甚至更好。添加功能命令:

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 进行编译,以便您的程序找到它的共享库(另请参阅 this answer)

关于c++ - 使用 libsocketcan 从用户空间启动/停止 CAN 板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34631327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com