3

我正在尝试使用来自用户空间的 SocketCAN 启动/停止 CAN 板或更新其波特率。我的测试是在 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?

谢谢你的帮助!

4

1 回答 1

1

sudo setcap cap_net_raw,cap_net_admin+ep your_executable是解决方案。您可能需要编译,-Wl,-rpath以便您的程序找到它的共享库(另请参阅此答案

于 2016-05-23T14:19:20.927 回答