Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中检测linux是否插入USB_C_Linux_Usb - Fatal编程技术网

如何在C中检测linux是否插入USB

如何在C中检测linux是否插入USB,c,linux,usb,C,Linux,Usb,我是C编程新手 这里我想检测一下Linux中是否插入了USB 我想在我的嵌入式linux设备上检测这些东西。他们已经定制了linux。 所以我想检测USB块,在那里我必须安装这个块。像sda、sdb或sdc。 我想在linux的C编程中实现这一点 这里我有usb设备的路径/sys/bus/usb/devices 我可以看到usb信息在这里/sys/bus/usb/devices/1-x 因此,我想获取插入usb的块的地址,如sda、sdb或sdc。 所以现在在获取这个地址名之后,我必须在特定的路

我是C编程新手 这里我想检测一下Linux中是否插入了USB 我想在我的嵌入式linux设备上检测这些东西。他们已经定制了linux。 所以我想检测USB块,在那里我必须安装这个块。像
sda、sdb或sdc
。 我想在linux的C编程中实现这一点

这里我有usb设备的路径
/sys/bus/usb/devices
我可以看到usb信息在这里
/sys/bus/usb/devices/1-x
因此,我想获取插入usb的块的地址,如
sda、sdb或sdc
。 所以现在在获取这个地址名之后,我必须在特定的路径上挂载usb


那么,有谁能告诉我,如果插入usb,如何检测usb是否插入,以及如何知道该usb的地址设置热插拔事件处理程序:当块设备出现或消失时,您将获得热插拔块事件,您可以使用它装载/卸载并运行处理程序脚本和应用程序。

设置热插拔事件处理程序:当块设备出现或消失时,您将获得热插拔块事件,您可以使用它装载/卸载并运行处理程序脚本和应用程序。

Udisk可以满足您的需要,但您应该对D-Bus有一些了解。 d-bus守护进程应该首先在嵌入式linux中运行

下面我写的是在我知道D总线之前检测udisk程序。这很糟糕,但可能会给你提示。 密钥路径:“/dev/disk/by uuid” 密钥文件:“/etc/mtab” 这显示了如何通过比较来装载udisk

/*
 * This program demonstrates method
 * detect U disk and mount it
 * if main exit umount it
 *
 * note: run as root
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    char *dirpath;
    char *filename;

    dirpath = "/dev/disk/by-uuid";
    filename = "/etc/mtab";

    //step 1. open dir and file
    DIR *dirp;
    FILE *mtab;

    //FILE *fopen(const char *path, const char *mode);
    if((mtab = fopen(filename, "r")) == NULL){
        fprintf(stderr, "open %s failed\n", filename);
        exit(1);
    }


    //DIR *opendir(const char *name);
    if((dirp = opendir(dirpath)) == NULL){
        fprintf(stdout, "opendir %s failed\n", dirpath);
        exit(1);
    }else{
        fprintf(stdout, "opendir %s successfully\n", dirpath);
    }

    //step 1.5 show content of dirpath
#if 0
    struct dirent {
        ino_t          d_ino;       /* inode number */
        off_t          d_off;       /* offset to the next dirent */
        unsigned short d_reclen;    /* length of this record */
        unsigned char  d_type;      /* type of file; not supported
                           by all file system types */
        char           d_name[256]; /* filename */
    };
#endif

    struct dirent *direntp;

    errno = 0;
    //struct dirent *readdir(DIR *dirp);
    while((direntp = readdir(dirp)) != NULL){
        fprintf(stdout, "%s\n", direntp->d_name);

    }
    if(errno != 0){
        perror("readdir failed");
        exit(1);
    }


    //void rewinddir(DIR *dirp);
    rewinddir(dirp);

    //step 1.6 get mounted device name
    char mdev[64][255];
    int i;
    int devnum;

    i = 0;
    //int fscanf(FILE *stream, const char *format, ...);
    while(fscanf(mtab, "%s", mdev[i]) != EOF){
        //int getc(FILE *stream);
        while(getc(mtab) != '\n')
            ;

        //int strncmp(const char *s1, const char *s2, size_t n);
        if(strncmp(mdev[i], "/dev/sd", 7) == 0 &&
           strncmp(mdev[i], "/dev/sda", 8) != 0){
            fprintf(stdout, "mdev: %s\n", mdev[i]);
            i++;
        }
    }

    strncpy(mdev[i], "", 1);

    //step 2. check content
    char buf[255];
    char path[255];
    char cmd[255];
    char *p;
    int flag;       /* if 0 not mount, if 1 mount */

    devnum = i;

    errno = 0; 
    //struct dirent *readdir(DIR *dirp);
    while((direntp = readdir(dirp)) != NULL){
        flag = 1;

        if(direntp->d_name[0] == '.'){ /* remove . and .. */
            continue;
        }
        //int snprintf(char *str, size_t size, const char *format, ...);
        snprintf(path, sizeof(path) - 1, "%s/%s",dirpath, direntp->d_name);

        //ssize_t readlink(const char *path, char *buf, size_t bufsiz);
        if(readlink(path, buf, sizeof(buf) - 1) < 0){
            perror("readlink failed");
            exit(1);
        }

        p = strrchr(buf, '/');
        if(p != NULL && strncmp(p, "/sda", 4) != 0){ /* remove sda* */
            //char *strchr(const char *s, int c);
            snprintf(path, sizeof(path) - 1, "/dev%s", p);

            fprintf(stdout, "step 2. %s, devnum = %d\n", path, devnum);

            for(i = 0; i < devnum; i++){ /* check mount */
                if(strcmp(mdev[i], path) == 0){
                    flag = 0;
                    break;
                }
            }

            //step 3. mount umounted usb
            if(flag == 1){
                fprintf(stdout, "need mount %s\n", path);

                //int snprintf(char *str, size_t size, const char *format, ...);
                snprintf(cmd, sizeof(cmd) - 1, "sudo mount %s /mnt", path);
                if(system(cmd) < 0){
                    fprintf(stderr, "system() %s failed: %s\n", 
                        path, strerror(errno));
                }
            }
        }

    }
    if(errno != 0){
        perror("readdir failed");
        exit(1);
    }


    sleep(10);

    //step 4. umount usb
    //int snprintf(char *str, size_t size, const char *format, ...);
    snprintf(cmd, sizeof(cmd) - 1, "sudo umount /mnt");
    if(system(cmd) < 0){
        fprintf(stderr, "system() %s failed: %s\n", 
            path, strerror(errno));
    }

    //step 5. close dir
    //int closedir(DIR *dirp);
    closedir(dirp);
    fclose(mtab);

    return 0;

}
/*
*这个程序演示了这个方法
*检测U盘并装载它
*如果是主出口,请安装它
*
*注意:以root用户身份运行
*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*dirpath;
字符*文件名;
dirpath=“/dev/disk/by uuid”;
filename=“/etc/mtab”;
//步骤1.打开目录和文件
DIR*dirp;
文件*mtab;
//文件*fopen(常量字符*路径,常量字符*模式);
if((mtab=fopen(文件名,“r”))==NULL){
fprintf(stderr,“打开%s失败\n”,文件名);
出口(1);
}
//DIR*opendir(const char*name);
if((dirp=opendir(dirpath))==NULL){
fprintf(stdout,“opendir%s失败\n”,dirpath);
出口(1);
}否则{
fprintf(stdout,“opendir%s成功\n”,dirpath);
}
//步骤1.5显示dirpath的内容
#如果0
结构导向{
ino_t d_ino;/*inode编号*/
off\u t d\u off;/*偏移到下一个方向*/
此记录的未签名短d_recen;/*长度*/
未签名的char d_type;/*文件类型;不受支持
按所有文件系统类型*/
char d_name[256];/*文件名*/
};
#恩迪夫
结构方向*direntp;
errno=0;
//结构目录*readdir(目录*dirp);
while((direntp=readdir(dirp))!=NULL){
fprintf(stdout,“%s\n”,direntp->d_name);
}
如果(错误号!=0){
perror(“readdir失败”);
出口(1);
}
//无效倒带DIR(DIR*dirp);
复卷目录(dirp);
//步骤1.6获取安装的设备名称
char-mdev[64][255];
int i;
内特德夫南;
i=0;
//int fscanf(文件*流,常量字符*格式,…);
而(fscanf(mtab,“%s”,mdev[i])!=EOF){
//int getc(文件*流);
while(getc(mtab)!='\n')
;
//int strncmp(常量字符*s1,常量字符*s2,大小n);
如果(strncmp(mdev[i],“/dev/sd”,7)=0&&
strncmp(mdev[i],“/dev/sda”,8)!=0){
fprintf(标准输出,“mdev:%s\n”,mdev[i]);
i++;
}
}
strncpy(mdev[i],“”,1);
//步骤2.检查内容
char-buf[255];
字符路径[255];
char-cmd[255];
char*p;
int标志;/*如果0未装入,如果1装入*/
devnum=i;
errno=0;
//结构目录*readdir(目录*dirp);
while((direntp=readdir(dirp))!=NULL){
flag=1;
如果(direntp->d_name[0]='.'){/*remove.and*/
继续;
}
//int snprintf(字符*str,大小\u t大小,常量字符*格式,…);
snprintf(path,sizeof(path)-1,“%s/%s”,dirpath,direntp->d_name);
//ssize_t readlink(const char*path,char*buf,size_t bufsiz);
if(读链接(路径、buf、大小(buf)-1)<0){
perror(“readlink失败”);
出口(1);
}
p=strrchr(buf,“/”);
如果(p!=NULL&&strncmp(p,“/sda”,4)!=0){/*删除sda**/
//字符*strchr(常量字符*s,整数c);
snprintf(路径,sizeof(路径)-1,“/dev%s”,p);
fprintf(标准输出,“步骤2.%s,devnum=%d\n”,路径,devnum);
对于(i=0;i
Udisk可以满足您的需求,但您应该对D总线有一些了解。 及