补充示例.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
d85646aede
commit
e7a3e696f5
@ -302,13 +302,13 @@ struct rw_semaphore my_rws;
|
||||
void init_rwsem(struct rw_semaphore *sem);
|
||||
|
||||
// 获取读信号量
|
||||
void down_read(struct rw_semaphore *sem);
|
||||
void down_read(struct rw_semaphore *sem);
|
||||
int down_read_trylock(struct rw_semaphore *sem);
|
||||
// 释放读信号量
|
||||
void up_read(struct rw_semaphore *sem);
|
||||
|
||||
// 获取写信号量
|
||||
void down_write(struct rw_semaphore *sem);
|
||||
void down_write(struct rw_semaphore *sem);
|
||||
int down_write_trylock(struct rw_semaphore *sem);
|
||||
// 释放写信号量
|
||||
void up_write(struct rw_semaphore *sem);
|
||||
@ -316,7 +316,7 @@ void up_write(struct rw_semaphore *sem);
|
||||
|
||||
## 互斥体
|
||||
|
||||
尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX ()等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。
|
||||
尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX() 等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。
|
||||
|
||||
```cpp
|
||||
// 码定义名为互斥体
|
||||
@ -336,4 +336,50 @@ void fastcall mutex_unlock(struct mutex *lock);
|
||||
## 并发控制示例
|
||||
|
||||
```cpp
|
||||
static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, loff_t *position)
|
||||
{
|
||||
struct demo_dev *devp = filp->private_data;
|
||||
loff_t p = *position;
|
||||
ssize_t ret = 0;
|
||||
|
||||
// This is a test.
|
||||
// 分析和获取有效的读长度
|
||||
if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界
|
||||
return 0; // End of a file
|
||||
if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大
|
||||
count = DEMO_DATA_SIZE-p;
|
||||
|
||||
if(copy_to_user((void*)buffer, &devp->demo_text[p], count))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
{
|
||||
*position += count;
|
||||
ret = count;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t count, loff_t *position)
|
||||
{
|
||||
struct demo_dev *devp = filp->private_data;
|
||||
const char __user *p = buffer;
|
||||
|
||||
// This is a test.
|
||||
// 分析和获取有效的写长度
|
||||
if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界
|
||||
return 0; // End of a file
|
||||
if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大
|
||||
count = DEMO_DATA_SIZE-p;
|
||||
|
||||
if(copy_from_user(&devp->demo_text[p], (void*)buffer, count))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
{
|
||||
*position += count;
|
||||
ret = count;
|
||||
}
|
||||
|
||||
(void)devp;
|
||||
return p-buffer;
|
||||
}
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user