というわけで、その1では概念だけを説明したので
今回はセマフォの関数の覚書。
今回はセマフォの関数の覚書。
void sema_init(struct semaphore *sem, int val)
セマフォの初期化を行う。
引数1:セマフォ構造体。セマフォを識別するのに使う。
引数2:セマフォの初期化時点で持つ資源の数。
DECLARE_MUTEX(name)
DECLARE_MUTEX_LOCKED(name)
セマフォの生成、初期化を行うマクロ。
引数は生成するセマフォ構造体名。
ミューテックスとは相互排他(MUTual EXclusion)のことで、排他制御に使える。
要するに、DECLARE_MUTEXは初期資源として1つのセマフォ資源を持つセマフォを初期化する。
DECLARE_MUTEX_LOCKEDは名前のとおり、セマフォ資源を持たない、はじめからロックされた状態の
セマフォを生成、初期化する。
void init_MUTEX(struct semaphore *sem)
void init_MUTEX_LOCKED(struct semaphore *sem)
上記マクロとは生成、初期化を行ったが、こちらは初期化のみを行う。
void down(struct semaphore *sem)
引数1のセマフォ構造体から資源をひとつとる。
資源が0ならば、資源が取得できる(1になって、確保できるまで)待ち続ける。
int down_interruptible(struct semaphore *sem)
上のdownとほぼ同じ。
ちがうのは、待ちに入っている間に割り込みが入ることが出来る。
割り込みが発生すると、0以外の値を返し、待ちから復帰します。
int down_trylock(struct semaphore *sem)
待たないセマフォ。
確保するセマフォ資源がなかった場合は即座に0以外の値を返します。
void up(struct semaphore *sem)
確保しているセマフォ構造体のセマフォ資源を1つ返します。
例)
/* includeは省略 */
#define DRV_VERSION 1.0.0
#define LOCAL_VERSION 0.0.1
//cdevを定義。
struct cdev hoge_cdev;
//セマフォを定義
struct semaphore hoge_sem;
static int hoge_read_proc( char* page, char** start, off_t offset,
int count, int* eof, void* data )
{
int len = 0;
/* セマフォで排他処理開始(セマフォ確保) */
if ( down_interruptible( &hoge_sem ) ) {
printk("down_interruptible error\n" );
return -ERESTARTSYS;
}
len += sprintf(page + len, "hoge Driver Version : %s - %s \n", DRV_VERSION , LOCAL_VERSION);
len += sprintf(page + len, "hoge Driver Compiled : "__DATE__" "__TIME__"\n");
/* セマフォで排他処理終了(セマフォ解放) */
up( &hoge_sem );
return len;
}
int hoge_open(struct inode *inode, struct file *filp)
{
//なんかopen処理
}
int hoge_close(struct inode *inode, struct file *filp)
{
//なんかrelease処理
}
static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
//なんかioctl処理
}
//ファイルオペレーション構造体
//このサンプルドライバを使ってopenとかcloseとかioctlを呼び出すと
//hoge_openやらhoge_closeやらhoge_ioctlが呼び出される。
static struct file_operations fops =
{
.owner = THIS_MODULE,
.unlocked_ioctl = hoge_ioctl,
.open = hoge_open,
.release = hoge_close,
};
static int __init hoge_init(void)
{
//適当。
int hoge_major = 202, hoge_minor = 0;
dev_t hoge_dev_t;
struct proc_dir_entry *hoge_entry = 0;
//セマフォの初期化(ミューテックス)
init_MUTEX(&hoge_sem);
/* procファイルのエントリ作成 */
hoge_entry = create_proc_read_entry("driver/hogeinfo", 0, NULL, hoge_read_proc, NULL);
if(hoge_entry == NULL) return -1;
#if 1
/* 自分で指定したメジャー番号を使いたいときはこっち */
/* MKDEV(メジャー番号, マイナー番号)ってマクロでdev_t生成*/
hoge_dev_t = MKDEV(hoge_major, hoge_minor)
register_chrdev_region(hoge_dev_t, 1, "hoge")
#else
/* 空いているメジャー番号を動的に取得したいときはこっち */
alloc_chrdev_region(&hoge_dev_t, hoge_minor, 1, "hoge");
#endif
cdev_init(&hoge_cdev, &hoge_fops);
hoge_cdev.owner = THIS_MODULE;
ret = cdev_add(&hoge_cdev, , 1);
if(ret < 0){
remove_proc_entry("driver/hogeinfo", NULL);
return -1;
}
return 0;
}
static void __exit hoge_exit(void)
{
remove_proc_entry("driver/hogeinfo", NULL);
cdev_del(&hoge_cdev);
unregister_chrdev_region(hoge_dev_t, 1);
}
module_init(hoge_init);
module_exit(hoge_exit);
/procファイルを使うのコードの使いまわし。
procファイルの出力に排他処理をかけてます。
セマフォの初期化を行う。
引数1:セマフォ構造体。セマフォを識別するのに使う。
引数2:セマフォの初期化時点で持つ資源の数。
DECLARE_MUTEX(name)
DECLARE_MUTEX_LOCKED(name)
セマフォの生成、初期化を行うマクロ。
引数は生成するセマフォ構造体名。
ミューテックスとは相互排他(MUTual EXclusion)のことで、排他制御に使える。
要するに、DECLARE_MUTEXは初期資源として1つのセマフォ資源を持つセマフォを初期化する。
DECLARE_MUTEX_LOCKEDは名前のとおり、セマフォ資源を持たない、はじめからロックされた状態の
セマフォを生成、初期化する。
void init_MUTEX(struct semaphore *sem)
void init_MUTEX_LOCKED(struct semaphore *sem)
上記マクロとは生成、初期化を行ったが、こちらは初期化のみを行う。
void down(struct semaphore *sem)
引数1のセマフォ構造体から資源をひとつとる。
資源が0ならば、資源が取得できる(1になって、確保できるまで)待ち続ける。
int down_interruptible(struct semaphore *sem)
上のdownとほぼ同じ。
ちがうのは、待ちに入っている間に割り込みが入ることが出来る。
割り込みが発生すると、0以外の値を返し、待ちから復帰します。
int down_trylock(struct semaphore *sem)
待たないセマフォ。
確保するセマフォ資源がなかった場合は即座に0以外の値を返します。
void up(struct semaphore *sem)
確保しているセマフォ構造体のセマフォ資源を1つ返します。
例)
/* includeは省略 */
#define DRV_VERSION 1.0.0
#define LOCAL_VERSION 0.0.1
//cdevを定義。
struct cdev hoge_cdev;
//セマフォを定義
struct semaphore hoge_sem;
static int hoge_read_proc( char* page, char** start, off_t offset,
int count, int* eof, void* data )
{
int len = 0;
/* セマフォで排他処理開始(セマフォ確保) */
if ( down_interruptible( &hoge_sem ) ) {
printk("down_interruptible error\n" );
return -ERESTARTSYS;
}
len += sprintf(page + len, "hoge Driver Version : %s - %s \n", DRV_VERSION , LOCAL_VERSION);
len += sprintf(page + len, "hoge Driver Compiled : "__DATE__" "__TIME__"\n");
/* セマフォで排他処理終了(セマフォ解放) */
up( &hoge_sem );
return len;
}
int hoge_open(struct inode *inode, struct file *filp)
{
//なんかopen処理
}
int hoge_close(struct inode *inode, struct file *filp)
{
//なんかrelease処理
}
static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
//なんかioctl処理
}
//ファイルオペレーション構造体
//このサンプルドライバを使ってopenとかcloseとかioctlを呼び出すと
//hoge_openやらhoge_closeやらhoge_ioctlが呼び出される。
static struct file_operations fops =
{
.owner = THIS_MODULE,
.unlocked_ioctl = hoge_ioctl,
.open = hoge_open,
.release = hoge_close,
};
static int __init hoge_init(void)
{
//適当。
int hoge_major = 202, hoge_minor = 0;
dev_t hoge_dev_t;
struct proc_dir_entry *hoge_entry = 0;
//セマフォの初期化(ミューテックス)
init_MUTEX(&hoge_sem);
/* procファイルのエントリ作成 */
hoge_entry = create_proc_read_entry("driver/hogeinfo", 0, NULL, hoge_read_proc, NULL);
if(hoge_entry == NULL) return -1;
#if 1
/* 自分で指定したメジャー番号を使いたいときはこっち */
/* MKDEV(メジャー番号, マイナー番号)ってマクロでdev_t生成*/
hoge_dev_t = MKDEV(hoge_major, hoge_minor)
register_chrdev_region(hoge_dev_t, 1, "hoge")
#else
/* 空いているメジャー番号を動的に取得したいときはこっち */
alloc_chrdev_region(&hoge_dev_t, hoge_minor, 1, "hoge");
#endif
cdev_init(&hoge_cdev, &hoge_fops);
hoge_cdev.owner = THIS_MODULE;
ret = cdev_add(&hoge_cdev, , 1);
if(ret < 0){
remove_proc_entry("driver/hogeinfo", NULL);
return -1;
}
return 0;
}
static void __exit hoge_exit(void)
{
remove_proc_entry("driver/hogeinfo", NULL);
cdev_del(&hoge_cdev);
unregister_chrdev_region(hoge_dev_t, 1);
}
module_init(hoge_init);
module_exit(hoge_exit);
/procファイルを使うのコードの使いまわし。
procファイルの出力に排他処理をかけてます。
Trackbacks.
-
*スポンサーサイト*セマフォを使う(その2)* のトラックバックURLはこちら
- http://rosara.blog4.fc2.com/tb.php/13-d8d3eb8e
