2012-03-20 4 views
2

でLinux用されてどのように検出することができますUSB iが挿入されているUSBを検出したいかどうかのLinux に私は私の組み込みLinuxデバイス上でこの事を検出します。 Linuxをカスタマイズしています。 私はこのブロックをマウントする必要があるUSBのブロックを検出したいと思います。 sda,sdb or sdcのようになります。 私はLinuxのCプログラミングでこのことをしたいです。ここでは、挿入またはない私はここでCプログラミング に新しいですC

私はUSBデバイス/sys/bus/usb/devices のパスを持っている私は、USB情報が提供されて見ることができるので、私はこのUSBはsda,sdb or sdcのように挿入されたブロックのアドレスを取得したいここ/sys/bus/usb/devices/1-x です。 このアドレス名を取得した後、私は特定のパスにusbをマウントする必要があります。

ので、誰がどのように私はどのように私は、ホットプラグイベントハンドラを設定し、この

+0

埋め込みデバイスがhalまたはUDiskを実行していますか? –

+0

私はあなたを取得できません。どういう意味ですか? Udisksかもしれない – user1089679

+0

参照:http://stackoverflow.com/questions/20084740/udev-run-program-on-usb-flash-drive-insert。 C/C++でコードを作成して、usbの挿入時にコードからusbを監視する代わりに実行することができます。 – lepe

答えて

2

のアドレスを知ることができるより挿入した場合、USBが挿入されている検出することができ、私を提案してくださいすることができます時にブロックあなたは、ホットプラグブロックイベントを取得しますあなたのハンドラスクリプトとアプリケーションをマウント/アンマウントして実行するために使用することができます。

+0

まず、パスを解析して、私がマウントするよりも自分のアドレスを知る必要があります。 – user1089679

+0

どうすれば設定できますか? – user1089679

2

Udiskはあなたのニーズを満たすことができますが、D-Busの知識はあるはずです。 そして、d-busデーモンはまず組み込みLinuxで実行する必要があります。

以下は、私がD-Busを知る前にudiskプログラムを検出することです。非常に悪いですが、プロンプトを出すかもしれません。 キーパス: "/ dev/disk/by-uuid" キーファイル: "/ etc/mtab" これを比較してマウントする方法を示します。

/* 
* 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; 

} 
関連する問題