Ubuntuで私のハードウェアに関する情報を表示するためにCを書いた。今、私はOSの更新のためにファイルの代わりにハードウェアを直接照会するなど、より柔軟にする方法が気になります。だから私は書かれたものを見て/proc/scsi/scsi
同じことをすることで、コードが/proc/scsi/scsi以外のものを使うことができるuniceでも実行され、ハードウェア情報を表示する方法を学ぶことができると思いました。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch, file_name[25] = "/proc/scsi/scsi";
FILE *fp;
fp = fopen(file_name,"r"); // read mode
if( fp == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
printf("The contents of %s file are :\n", file_name);
while( ( ch = fgetc(fp) ) != EOF )
printf("%c",ch);
fclose(fp);
return 0;
}
私にとっては、
$ cc driveinfo.c;./a.out
The contents of /proc/scsi/scsi file are :
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: WDC WD2500JS-75N Rev: 10.0
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST3250824AS Rev: 3.AD
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: TSSTcorp Model: DVD+-RW TS-H653A Rev: D300
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi3 Channel: 00 Id: 00 Lun: 00
Vendor: Optiarc Model: DVD-ROM DDU1681S Rev: 102A
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
Vendor: Lexar Model: USB Flash Drive Rev: 1100
Type: Direct-Access ANSI SCSI revision: 00
Host: scsi5 Channel: 00 Id: 00 Lun: 00
Vendor: WD Model: 5000AAKB Externa Rev: l108
Type: Direct-Access ANSI SCSI revision: 00
他のユニス(bsdなど)でも動作しますか? ms-windowsでどのように実行しますか?ファイルの代わりにハードウェアを直接クエリできますか/proc/scsi/scsi
?
答え1
ファイルシステムは/proc
実際ではなく、ファイルのように見えるようにエクスポートされたカーネル内部データのビューです。これはLinuxとSolaris(アイデアはそこからはっきりと盗まれた)と、おそらく他のUnixyシステムに存在します。フォーマットはシステムによって大きく異なります(Linuxカーネルバージョン間で大きく変更されることもあります)。
実際、ハードウェアデータを見つけるための中程度の移植可能な方法はありません(一部のUnicesと同様のものは本当に奇妙な鉄で実行することはできません)。
答え2
/proc ファイルシステムは Linux 中心なので、答えは「いいえ」です。 BSDシステムはsysctlを使用してこの情報を取得します。私の考えでは、Windowsの場合、このグループが質問するのに最適なグループではありません。 :)