如何在Ubuntu和C/C++下拔下USB设备而无需重新启动
How to unplug a USB device under Ubuntu and C/C++ without rebooting
我使用带有termios的C程序在带有Ubuntu的pc和USB电机控制器之间交换信息和命令。
它工作得很好,我能够成功地通过串行端口发送消息;然而,有时如果我以错误的方式关闭程序或发生其他事情,我将无法再连接到我的usb设备。
为了能够再次连接到设备,我必须重新启动我的电脑并重新启动ubuntu。
我想避免这个问题,并找到一个解决方案,再次启用usb端口,而不必每次重新启动我的系统。
第一次,我试图杀死所有使用usb端口的进程(sudo killall-9 program_name),但端口仍然被阻止,我不得不重新启动它。
你能给我一些避免重新启动的解决方案吗?为什么会发生这种情况?
我以这种方式连接到usb端口(/dev/ttyACM0):
handle = open(port.c_str(), O_RDWR |O_NOCTTY | O_NDELAY);
if(handle == RQ_INVALID_HANDLE)
{
cout<<"failed."<<endl;
return RQ_ERR_OPEN_PORT;
}
为了避免USB控制器不可用,您可以强化程序以更好地处理程序终止。
创建一个例行程序来进行清理,即关闭USB连接。我们称之为void cleanup(void) {}
您可以使用stdlib.h中的atexit
函数来注册一个函数,该函数将在程序正常终止时被调用。这意味着主要通过exit
或return
。请参阅atexit手册页例如:int res = atexit(cleanup);
对于程序不规则终止的情况,比如通过信号(例如,当您按下Ctrl+c时的SIGINT),您必须实现信号处理程序来处理此问题。基本上,您可以创建一个信号处理程序函数,该函数只调用您的清理例程,并将其注册到您想要处理的所有信号中。关于如何做到这一点的更多细节:信号处理程序教程
如果你的程序在某种程度上被终止了,这是无法处理的,例如,使用SIGKILL,你要么必须重新启动,要么查看pmg在评论中链接到的帖子中的方法——它们看起来很有希望。
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 重新启动后,线程无法在 while 循环中再次运行
- 在程序和基于文本的游戏和C++内重新启动程序
- 在程序/基于文本的游戏/C++内重新启动程序
- 为什么使用 exec() 重新启动程序不能正常工作?
- 即使在我关闭应用程序并重新启动它后,如何保持我的 ID 被阻止?
- 有没有办法在不重新启动或注销的情况下加载游标?
- IO服务重新启动后,Boost最后期限计时器持续触发
- 在C++中重新启动随机数序列
- 稍后在构造函数中重新启动异常指令删除此指令
- 如何获取代码::块以在代码::块重新启动后保持库的配置?
- 我想在我设置的几秒钟后重新启动我的程序
- 如何使重新启动此循环,当用户输入 1 时,并在 0 时停止
- UDP 服务器每 5 秒重新启动一次
- 有没有办法检查内存缓存是否已重新启动?
- (Windows 10) 在不更新的情况下重新启动C++
- Live555MediaServer 在每个新连接时重新启动流。为什么将"reuseSource"设置为 true 无法按预期工作?
- 重新启动后禁用 USB 键盘
- 如何在Ubuntu和C/C++下拔下USB设备而无需重新启动