如何编写程序来扫描连接的USB并在终端中显示它们

时间:2015-04-17 16:55:16

标签: c linux usb

我只是想知道如果有可能在linux中用c编写一个程序来扫描连接到系统的USB并在终端中显示它们。

我有很好的shell脚本编写,但不知道如何在C程序中使用它。在shell脚本中,我们可以使用echo命令来执行许多功能,但是什么是C语言中的echo替换。

任何指南或示例代码都会有所帮助,谢谢。!

2 个答案:

答案 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程序,该程序可让您访问此信息,并与无特权的用户共享。