1.把下面的代码保存为usbreset.c文件,保存在home路径下
/*重启usb硬件端口*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;
if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];//表示usb的ID
fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}
printf("Resetting USB device %s\n", filename);
rc = ioctl(fd, USBDEVFS_RESET, 0);//ioctl是设备驱动中,对I/O设备进行管理的函数
if (rc < 0) {
perror("Error in ioctl");
return 1;
}
printf("Reset successful\n");
close(fd);
return 0;
}
2.在home路径下打开终端,编译上面的文件,如下输入命令:
$ cc usbreset.c -o usbreset
3.在命令行输入命令,获取你想要的重置的BUS(总线)和Device(设备)的ID,输入如下命令:
$ lsusb
下面是我获取的ID号:
Bus 002 Device 003: ID 0fe9:9010 DVICO
4.使编译后的程序可执行,输入如下命令:
$ chmod +x usbreset
5.在终端打开程序,并输入通过上面的lsusb命令获得的ID号,输入如下命令:
$ sudo ./usbreset /dev/bus/usb/002/003
我在这个usb口连接的鼠标,当我执行第5步的时候,可以看到鼠标的红灯灭了一下,然后重新亮起。
在这顺便说一下,上述代码中main函数的两个输入参数(int argc, char **argv)的意义如下:
第一个参数argc是int型的,它用来存放命令行参数的个数。实际上argc所存放的数值比命令行参数的个数多1,这是因为系统默认将命令字(可执行文件名)作为第一个参数,存放在argv[0]的位置处。
第二个参数argv是一个一维的一级指针数组,它是用来存放命令行中各个参数和命令字的字符串的,并且规定:
argv[0]存放命令字,也就是可执行的文件名(包括文件的完整路径)
argv[1]存放命令行中第一个参数
argv[2]存放命令行中第二个参数
······
在上面的例子中,“./usbreset” 就存放在argv[0], “/dev/bus/usb/002/003 ”就存放在argv[1],而argc就等于2
参考资料连接:
askubuntu.com/questions/6…