如何在Ubuntu和C/C++下拔下USB设备而无需重新启动

How to unplug a USB device under Ubuntu and C/C++ without rebooting

本文关键字:USB 重新启动 Ubuntu C++      更新时间:2023-10-16

我使用带有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函数来注册一个函数,该函数将在程序正常终止时被调用。这意味着主要通过exitreturn。请参阅atexit手册页例如:int res = atexit(cleanup);

对于程序不规则终止的情况,比如通过信号(例如,当您按下Ctrl+c时的SIGINT),您必须实现信号处理程序来处理此问题。基本上,您可以创建一个信号处理程序函数,该函数只调用您的清理例程,并将其注册到您想要处理的所有信号中。关于如何做到这一点的更多细节:信号处理程序教程

如果你的程序在某种程度上被终止了,这是无法处理的,例如,使用SIGKILL,你要么必须重新启动,要么查看pmg在评论中链接到的帖子中的方法——它们看起来很有希望。