如何编写程序来扫描连接的 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 程序,使您能够访问此信息,并与非特权用户共享。