我只是想知道如果有可能在linux中用c编写一个程序来扫描连接到系统的USB并在终端中显示它们。
我有很好的shell脚本编写,但不知道如何在C程序中使用它。在shell脚本中,我们可以使用echo命令来执行许多功能,但是什么是C语言中的echo替换。
任何指南或示例代码都会有所帮助,谢谢。!
答案 0 :(得分:2)
这应该很有趣! :)正如你在问题中指出的那样,我发送给你一个在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;
}
答案 1 :(得分:2)
您可以使用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
程序,该程序可让您访问此信息,并与无特权的用户共享。