質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

3833閲覧

Linux(RaspberryPI)に既についているUSBメモリの認識場所(/dev/sda1)を得たい。

cafe_takai

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

2クリップ

投稿2019/03/07 09:07

前提・実現したいこと

C言語を用いて、Linux(RaspberryPI)に既についているUSBメモリの認識場所(/dev/sda1)を得たいのですが方法が分かりません。

発生している問題

USBメモリのデバイスモード(/dev/bus/usb/002/002)は得られるのですが、認識場所(/dev/sda1)が得られません。

該当のソースコード

C

1#include <libudev.h> 2#include <stdio.h> 3#include <stdlib.h> 4 5/* メイン関数 */ 6int main(void) { 7 struct udev *udev; 8 struct udev_enumerate *enumerate; 9 struct udev_list_entry *devices; 10 11 udev = udev_new(); 12 if (!udev) { 13 printf("Can't create udev\n"); 14 exit(1); 15 } 16 17 // 現時点でどのデバイスにプラグインしているか? 18 enumerate = udev_enumerate_new(udev); 19 udev_enumerate_add_match_subsystem(enumerate, "scsi"); 20 udev_enumerate_add_match_property(enumerate, "DEVTYPE", "scsi_device"); 21 udev_enumerate_scan_devices(enumerate); 22 23 devices = udev_enumerate_get_list_entry(enumerate); 24 struct udev_list_entry *entry; 25 26 // インストールされているものを列挙する 27 udev_list_entry_foreach(entry, devices) { 28 const char *path = udev_list_entry_get_name(entry); 29 struct udev_device *scsi = udev_device_new_from_syspath(udev, path); 30 struct udev_device *usb = udev_device_get_parent_with_subsystem_devtype(scsi, "usb", "usb_device"); 31 const char *node; 32 if (usb) { 33 node = udev_device_get_devnode(usb); 34 printf("usb = %s:%s:%s, scsi = %s / devnode = :%s:%s\n", 35 udev_device_get_sysattr_value(usb, "idVendor"), 36 udev_device_get_sysattr_value(usb, "idProduct"), 37 node, 38 udev_device_get_sysattr_value(scsi, "vendor"), 39 udev_device_get_devnode(usb), 40 udev_device_get_devnode(scsi) 41 ); 42 } 43 udev_device_unref(scsi); 44 } 45 udev_enumerate_unref(enumerate); 46} 47

出力結果

usb = 0411:023a:/dev/bus/usb/002/002, scsi = BUFFALO / devnode = :/dev/bus/usb/002/002:(null)

試したこと

udev_device_get_devnodeやudev_device_get_sysattr_valueのパラメータを色々と変えたのですが、ダメでした。

どなた様か、ご教示いただけましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

/sys/dev/block/ 以下のシンボリックリンクのリンク先パスを見るとわかるかもしれません。

$ ls -l /sys/dev/block/ (表示例) lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:0 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:1 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda1 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:16 -> ../../devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:17 -> ../../devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:18 -> ../../devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb2 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:2 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda2 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:3 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda3 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:4 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda4 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:5 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda5 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:6 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda6 lrwxrwxrwx 1 root root 0 Mar 7 18:55 8:7 -> ../../devices/pci0000:00/0000:00:1f.2/ata4/host3/target3:0:0/3:0:0:0/block/sda/sda7 ※sdb が USB ストレージでパーティション 2つ

###(2019/03/07 23:11) 追記
リンク先パスに usb という文字列があるものを抜き出せばいいのでは? という意図でした。
コマンドなら以下のように。

$ ls -l /sys/dev/block/* | sed -n '/usb/s|^.*/||p' sdb sdb1 sdb2

あるいは、ファイルシステムにラベルが付いているのであれば、lsblk -l -o NAME,LABEL などでわかると思います。

投稿2019/03/07 10:12

編集2019/03/07 14:12
TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cafe_takai

2019/03/07 12:48

ご回答ありがとうございます。C言語にすると、次の通りでしょうか。 #include <libudev.h> #include <stdio.h> #include <stdlib.h> /* メイン関数 */ int main(void) { char buff[1024]; FILE *fp = popen("ls -l /sys/dev/block/", "r"); while (fgets(buff, sizeof(buff), fp)) { printf("result: %s", buff); } pclose(fp); } 得られた中から、/dev/sd*...を探せば可能だと思うのですが、直接に/dev/sda1を得られる方法はないでしょうか? USBを抜き差しする折、sda1 / sdb1 / sdc1 ....となってしまうので、得られた結果の中から順に探すという方法もあると思うのですが、いくつまで探せばいいのかという課題もあいますし、直接に抽出できたらと思うのです。 生意気申しあげ申し訳ありません。アドバイスありましたらお願い申しげます。
cafe_takai

2019/03/07 21:29

アドバイスありがとうございます。 詳細コマンドありがとうございます。頂戴しました内容で対応させていただきます。 ご教示賜り、誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問