如何使用C程序查找可移动设备的序列号

如何使用C程序查找可移动设备的序列号,c,linux,usb,usb-drive,C,Linux,Usb,Usb Drive,我正在使用bash脚本为我的另一个应用程序获取可移动设备(如笔驱动器)的序列号。 是否有可能在本机C中执行此操作?是否有人可以将此bash转换为C #!/bin/bash for C in `ls /sys/block/`; do RE=`cat /sys/block/$C/removable` if [ $RE == "1" ] ;then #VENDOR=`/bin/udevadm info --name=/dev/$C | grep ID

我正在使用bash脚本为我的另一个应用程序获取可移动设备(如笔驱动器)的序列号。 是否有可能在本机C中执行此操作?是否有人可以将此bash转换为C

#!/bin/bash
for C in `ls /sys/block/`; do 
    RE=`cat /sys/block/$C/removable`
        if [ $RE == "1" ] ;then 
            #VENDOR=`/bin/udevadm info --name=/dev/$C | grep ID_VENDOR=|awk -F"=" ' { print $2}'`
            #MODEL=`/bin/udevadm info --name=/dev/$C | grep ID_MODEL=|awk -F"=" ' { print $2}'`
            #SERIAL=`/bin/udevadm info --name=/dev/$C | grep SERIAL_SHORT|awk -F"=" ' { print $2}'`
            #echo $VENDOR-$MODEL"-"$SERIAL #print as per your taste
            USB_SERIAL=`/bin/udevadm info --name=/dev/$C | grep ID_SERIAL=|awk -F"=" ' { print $2}'|awk -F"-" ' { print $1}'`
            echo  $USB_SERIAL #or just the default one
        fi 
done

我不想使用系统调用。想要纯C程序

这里的关键挑战是,因为您不想使用
system()
,来模拟
udevadm info
的工作。以下程序(至少在我的系统上)通过读取
/run/udev/data/bMAJOR:MINOR
中的信息来实现这一点,其中MAJOR和MINOR是我们从
/sys/block/NAME/dev
中获得的设备号,NAME是块设备名

#include <dirent.h>
#include <stdio.h>

int main()
{
    struct dirent *entry;           // read thru the entries in "/sys/block"
    for (DIR *dirp = opendir("/sys/block"); entry = readdir(dirp); )
    if (entry->d_type == DT_LNK)    // the relevant files are symbolic links
    {
        char path[277];
        sprintf(path, "/sys/block/%s/removable", entry->d_name);
        FILE *fp = fopen(path, "r"); if (!fp) return perror(path), 1;
        int re;                     // read the /sys/block/%s/removable flag
        fscanf(fp, "%d", &re), fclose(fp);
        if (re)
        {                           // read the device's MAJOR:MINOR numbers
            sprintf(path, "/sys/block/%s/dev", entry->d_name);
            fp = fopen(path, "r"); if (!fp) return perror(path), 1;
            fscanf(fp, "%s", path+sprintf(path, "/run/udev/data/b")),
            fclose(fp);
            fp = fopen(path, "r"); if (!fp) return perror(path), 1;
            char USB_serial[NAME_MAX];  // scan the udev/data for ID_SERIAL=
            while (fgets(path, sizeof path, fp))
                if (sscanf(path, "E:ID_SERIAL=%[^-]", USB_serial) > 0)
                    puts(USB_serial);
            fclose(fp);
        }
    }
}
#包括
#包括
int main()
{
struct dirent*entry;//读取“/sys/block”中的条目
for(DIR*dirp=opendir(“/sys/block”);entry=readdir(dirp);)
if(entry->d_type==DT_LNK)//相关文件是符号链接
{
字符路径[277];
sprintf(路径“/sys/block/%s/removable”,条目->数据单元名称);
FILE*fp=fopen(路径,“r”);如果(!fp)返回perror(路径),则为1;
int re;//读取/sys/block/%s/removable标志
fscanf(fp、%d、&re)、fclose(fp);
如果(re)
{//读取设备的主要:次要编号
sprintf(路径“/sys/block/%s/dev”,条目->数据单元名称);
fp=fopen(路径,“r”);如果(!fp)返回peror(路径),则为1;
fscanf(fp,“%s”,path+sprintf(path,“/run/udev/data/b”),
fclose(fp);
fp=fopen(路径,“r”);如果(!fp)返回peror(路径),则为1;
char USB_serial[NAME_MAX];//扫描udev/数据以查找ID_serial=
while(fgets(path,sizeof path,fp))
如果(sscanf(路径“E:ID_SERIAL=%[^-]”,USB_SERIAL)>0)
puts(USB_串行);
fclose(fp);
}
}
}

标准C库不包含此功能;您必须依赖于操作系统特定的代码,这些代码与您上面所做的完全相同——从/sys/文件中读取。Stackoverflow更适合于询问有关编程的特定问题。如果你希望有人根据你的规范为你编写一些软件,试试一个自由职业者网站。这是我的bash的绝佳替代品。