2011-08-12 9 views
2

私はLinuxシステムでC言語でコーディングしています。 USBフラッシュドライブを挿入して、dev/dev/sdcと/ dev/sdc1にdevノードを作成させ、/ dev/sdcが現れるときにのみアクションを取らせます。私が行ってきたことは、これをCアプリケーションの待ちループとみなし、devノードがudevデーモンによって作成されるのを待っています。何かのように次のようUSBフラッシュドライブの挿入のためのunix/linux devノード作成の検出またはテスト方法

if(/* /dev/sdc exists */) 
{ 
    do_something(); 
} 
else 
{ 
    wait(); 
} 

私の最初の問題であり、どのようなCライブラリ関数の値を返すために、私の場合は()のテストに行くことができる「は/ dev/sdcのが存在します。」私の2番目の問題は、私は単にこれを間違って近づけていますか?私はudevモニタ構造を使ってこれをまっすぐに検出するべきでしょうか?

答えて

2

標準ライブラリのfstat()を見てみるとよいでしょう。 これにより、ファイルの存在/非存在を素早くチェックし、それに基づいて行動することができます。これは、エレガントな解決策ではなく、あなたの質問に答える

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

.... 

struct stat s; 
stat("/pat/to/node" , &s); 
if (IS_BLK(s.st_mode)) { 
    /* the file exists and is a block device */ 
} 

: は基本的に、あなたがする必要があります。 私はそれを試していないので、コードはいくつかのチューニングが必要かもしれませんが、それはトリックを行う必要があります。

乾杯。

+0

私はこれを試して、それは動作するようです。 eglibc 2.10ライブラリの場合、 'if(S_ISBLK(s.st_mode)){ /*ファイルが存在し、ブロックデバイスです。 */ } ' 唯一の調整はマクロ名でした。 もう一度お世話になります。 – Mark

1

おそらくudevルールを使用したいと思うかもしれません。

Running external programs upon certain events

デバイスが接続または切断されたときにさらにudevルールを書くための別の理由は、特定のプログラムを実行することです。たとえば、デジタルカメラが接続されているときに、デジタルカメラからすべての写真を自動的にダウンロードするスクリプトを実行することができます。

+2

小規模なスタンドアロン用途では問題ありませんが、udevを制御することができない大規模なアプリケーションエコシステムに統合する場合は、DBusの方法を理解しておくとよいでしょう。 –

関連する問題