如何编写程序来扫描连接的 USB 并在终端中显示它们
how to write a program to scan for the connected USB and show them in terminal
我只是想知道是否可以在 linux 中用 c 编写一个程序来扫描连接到系统的 usb 并在终端中显示它们。
我很擅长 shell 脚本编写,但不知道如何在 C 程序中执行此操作。在shell 脚本中,我们可以使用echo 命令来完成很多功能,但是C 语言中echo 的替代品是什么?
任何指南或示例代码都会有所帮助,谢谢。!
这应该很有趣! :) 正如您在问题中指出的那样,我向您发送了一种在 C 程序中获得回声的方法! :)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <malloc.h>
#define BUF_SIZE 1024
int main(void)
{
FILE *f;
char * buf;
f=popen("lsusb", "r");
if (f==NULL) {
perror("1 - Error");
return errno;
}
buf=malloc(BUF_SIZE);
if (buf==NULL) {
perror("2 - Error");
pclose(f);
return errno;
}
while(fgets(buf,BUF_SIZE,f)!=NULL) {
printf("%s",buf);
}
puts("");
pclose(f);
free(buf);
return 0;
}
你可以使用 libusb
这是一种更强大的方式来做你想做的事,你需要 root 权限或至少对所有 usb 设备的读取权限,你可以创建一个 udev rule 为此,这是代码
#include <libusb-1.0/libusb.h>
#include <assert.h>
#include <stdio.h>
int main()
{
libusb_context *context;
libusb_device **list;
ssize_t count;
size_t index;
if (libusb_init(&context) != 0)
{
fprintf(stderr, "error: intializing `libusb'");
return -1;
}
count = libusb_get_device_list(context, &list);
for (index = 0; index < count; ++index)
{
struct libusb_device *device;
struct libusb_device_descriptor descriptor;
char buffer[256];
struct libusb_device_handle *handle;
int result;
device = list[index];
if ((result = libusb_get_device_descriptor(device, &descriptor)) != 0)
{
fprintf(stderr, "error(%d): reading descriptor\n", result);
continue;
}
if ((result = libusb_open(device, &handle)) != 0)
{
fprintf(stderr, "error(%d): openning device 0x%04X:0x%04X\n",
result, descriptor.idVendor, descriptor.idProduct);
continue;
}
fprintf(stdout, "\ndevice #: %zu 0x%04X:0x%04X\n",
index, descriptor.idVendor, descriptor.idProduct);
result = libusb_get_string_descriptor_ascii(
handle,
descriptor.iProduct,
(unsigned char *)buffer,
sizeof(buffer)
);
if (result != 0)
fprintf(stdout, "\tproduct : %s\n", buffer);
result = libusb_get_string_descriptor_ascii(
handle,
descriptor.iManufacturer,
(unsigned char *)buffer,
sizeof(buffer)
);
if (result != 0)
fprintf(stdout, "\tmanufacturer: %s\n", buffer);
libusb_close(handle);
}
return 0;
}
记得将 -lusb-1.0
传递给链接器命令,或者如果您使用 Makefile
,请将其添加到 LDFLAGS
。
实现该目标的简单 udev 规则是
SUBSYSTEMS=="usb",MODE="0660",GROUP="usb"
正在将您的用户添加到 usb 组。
您还可以编写一个简单的 dbus
程序,使您能够访问此信息,并与非特权用户共享。
我只是想知道是否可以在 linux 中用 c 编写一个程序来扫描连接到系统的 usb 并在终端中显示它们。
我很擅长 shell 脚本编写,但不知道如何在 C 程序中执行此操作。在shell 脚本中,我们可以使用echo 命令来完成很多功能,但是C 语言中echo 的替代品是什么?
任何指南或示例代码都会有所帮助,谢谢。!
这应该很有趣! :) 正如您在问题中指出的那样,我向您发送了一种在 C 程序中获得回声的方法! :)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <malloc.h>
#define BUF_SIZE 1024
int main(void)
{
FILE *f;
char * buf;
f=popen("lsusb", "r");
if (f==NULL) {
perror("1 - Error");
return errno;
}
buf=malloc(BUF_SIZE);
if (buf==NULL) {
perror("2 - Error");
pclose(f);
return errno;
}
while(fgets(buf,BUF_SIZE,f)!=NULL) {
printf("%s",buf);
}
puts("");
pclose(f);
free(buf);
return 0;
}
你可以使用 libusb
这是一种更强大的方式来做你想做的事,你需要 root 权限或至少对所有 usb 设备的读取权限,你可以创建一个 udev rule 为此,这是代码
#include <libusb-1.0/libusb.h>
#include <assert.h>
#include <stdio.h>
int main()
{
libusb_context *context;
libusb_device **list;
ssize_t count;
size_t index;
if (libusb_init(&context) != 0)
{
fprintf(stderr, "error: intializing `libusb'");
return -1;
}
count = libusb_get_device_list(context, &list);
for (index = 0; index < count; ++index)
{
struct libusb_device *device;
struct libusb_device_descriptor descriptor;
char buffer[256];
struct libusb_device_handle *handle;
int result;
device = list[index];
if ((result = libusb_get_device_descriptor(device, &descriptor)) != 0)
{
fprintf(stderr, "error(%d): reading descriptor\n", result);
continue;
}
if ((result = libusb_open(device, &handle)) != 0)
{
fprintf(stderr, "error(%d): openning device 0x%04X:0x%04X\n",
result, descriptor.idVendor, descriptor.idProduct);
continue;
}
fprintf(stdout, "\ndevice #: %zu 0x%04X:0x%04X\n",
index, descriptor.idVendor, descriptor.idProduct);
result = libusb_get_string_descriptor_ascii(
handle,
descriptor.iProduct,
(unsigned char *)buffer,
sizeof(buffer)
);
if (result != 0)
fprintf(stdout, "\tproduct : %s\n", buffer);
result = libusb_get_string_descriptor_ascii(
handle,
descriptor.iManufacturer,
(unsigned char *)buffer,
sizeof(buffer)
);
if (result != 0)
fprintf(stdout, "\tmanufacturer: %s\n", buffer);
libusb_close(handle);
}
return 0;
}
记得将 -lusb-1.0
传递给链接器命令,或者如果您使用 Makefile
,请将其添加到 LDFLAGS
。
实现该目标的简单 udev 规则是
SUBSYSTEMS=="usb",MODE="0660",GROUP="usb"
正在将您的用户添加到 usb 组。
您还可以编写一个简单的 dbus
程序,使您能够访问此信息,并与非特权用户共享。