问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

驱动如何进行进程的状态改变和切换

发布网友 发布时间:2022-05-01 13:52

我来回答

1个回答

热心网友 时间:2023-10-16 09:38

//在驱动程序中改变进程的状态并调用schele()
static sszie_t xxx_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{
...
DECLARE_WAITQUEUE(wait, current); /* 定义等待队列 */
add_wait_queue(&xxx_wait, &wait); /* 添加等待队列 */
ret = count;
/* 等待设备缓冲区可写 */
do {
avail = device_writable(...);
if (avail < 0)
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态 */
if (avail < 0) {
if (file->f_flags & O_NONBLOCK) { /* 非阻塞 */
if (!ret)
ret = - EAGAIN;
goto out;
}
schele(); /* 调度其他进程执行 */
if (signal_pending(current)) { /* 如果是因为信号唤醒 */
if (!ret)
ret = - ERESTARTSYS;
goto out;
}
}
}while (avail < 0);
/* 写设备缓冲区 */
device_write(...);
out:
remove_wait_queue(&xxx_wait, &wait); /* 将等待队列移出等待队列头 */
set_current_state(TASK_RUNNING);
return ret;
}
要点:
(1)如果是非阻塞访问(O_NONBLOCK被设置),设备忙时,直接返回"-EAGAIN".
(2)对于阻塞访问,会进行状态切换并显式通过"schele()"调度其他进程执行;
(3)醒来的时候要注意,由于调度出去的时候,进程的状态时TASK_INTERRUPTIBLE,即浅度睡眠,因此唤醒它的有可能是信号,
因此,我们首相通过“signal_pending(current)”了解是不是信号唤醒的,如果是,理解返回“-ERESTARTSYS”.

热心网友 时间:2023-10-16 09:38

//在驱动程序中改变进程的状态并调用schele()
static sszie_t xxx_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{
...
DECLARE_WAITQUEUE(wait, current); /* 定义等待队列 */
add_wait_queue(&xxx_wait, &wait); /* 添加等待队列 */
ret = count;
/* 等待设备缓冲区可写 */
do {
avail = device_writable(...);
if (avail < 0)
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态 */
if (avail < 0) {
if (file->f_flags & O_NONBLOCK) { /* 非阻塞 */
if (!ret)
ret = - EAGAIN;
goto out;
}
schele(); /* 调度其他进程执行 */
if (signal_pending(current)) { /* 如果是因为信号唤醒 */
if (!ret)
ret = - ERESTARTSYS;
goto out;
}
}
}while (avail < 0);
/* 写设备缓冲区 */
device_write(...);
out:
remove_wait_queue(&xxx_wait, &wait); /* 将等待队列移出等待队列头 */
set_current_state(TASK_RUNNING);
return ret;
}
要点:
(1)如果是非阻塞访问(O_NONBLOCK被设置),设备忙时,直接返回"-EAGAIN".
(2)对于阻塞访问,会进行状态切换并显式通过"schele()"调度其他进程执行;
(3)醒来的时候要注意,由于调度出去的时候,进程的状态时TASK_INTERRUPTIBLE,即浅度睡眠,因此唤醒它的有可能是信号,
因此,我们首相通过“signal_pending(current)”了解是不是信号唤醒的,如果是,理解返回“-ERESTARTSYS”.

热心网友 时间:2023-10-16 09:38

//在驱动程序中改变进程的状态并调用schele()
static sszie_t xxx_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{
...
DECLARE_WAITQUEUE(wait, current); /* 定义等待队列 */
add_wait_queue(&xxx_wait, &wait); /* 添加等待队列 */
ret = count;
/* 等待设备缓冲区可写 */
do {
avail = device_writable(...);
if (avail < 0)
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态 */
if (avail < 0) {
if (file->f_flags & O_NONBLOCK) { /* 非阻塞 */
if (!ret)
ret = - EAGAIN;
goto out;
}
schele(); /* 调度其他进程执行 */
if (signal_pending(current)) { /* 如果是因为信号唤醒 */
if (!ret)
ret = - ERESTARTSYS;
goto out;
}
}
}while (avail < 0);
/* 写设备缓冲区 */
device_write(...);
out:
remove_wait_queue(&xxx_wait, &wait); /* 将等待队列移出等待队列头 */
set_current_state(TASK_RUNNING);
return ret;
}
要点:
(1)如果是非阻塞访问(O_NONBLOCK被设置),设备忙时,直接返回"-EAGAIN".
(2)对于阻塞访问,会进行状态切换并显式通过"schele()"调度其他进程执行;
(3)醒来的时候要注意,由于调度出去的时候,进程的状态时TASK_INTERRUPTIBLE,即浅度睡眠,因此唤醒它的有可能是信号,
因此,我们首相通过“signal_pending(current)”了解是不是信号唤醒的,如果是,理解返回“-ERESTARTSYS”.

热心网友 时间:2023-10-16 09:38

//在驱动程序中改变进程的状态并调用schele()
static sszie_t xxx_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{
...
DECLARE_WAITQUEUE(wait, current); /* 定义等待队列 */
add_wait_queue(&xxx_wait, &wait); /* 添加等待队列 */
ret = count;
/* 等待设备缓冲区可写 */
do {
avail = device_writable(...);
if (avail < 0)
__set_current_state(TASK_INTERRUPTIBLE); /* 改变进程状态 */
if (avail < 0) {
if (file->f_flags & O_NONBLOCK) { /* 非阻塞 */
if (!ret)
ret = - EAGAIN;
goto out;
}
schele(); /* 调度其他进程执行 */
if (signal_pending(current)) { /* 如果是因为信号唤醒 */
if (!ret)
ret = - ERESTARTSYS;
goto out;
}
}
}while (avail < 0);
/* 写设备缓冲区 */
device_write(...);
out:
remove_wait_queue(&xxx_wait, &wait); /* 将等待队列移出等待队列头 */
set_current_state(TASK_RUNNING);
return ret;
}
要点:
(1)如果是非阻塞访问(O_NONBLOCK被设置),设备忙时,直接返回"-EAGAIN".
(2)对于阻塞访问,会进行状态切换并显式通过"schele()"调度其他进程执行;
(3)醒来的时候要注意,由于调度出去的时候,进程的状态时TASK_INTERRUPTIBLE,即浅度睡眠,因此唤醒它的有可能是信号,
因此,我们首相通过“signal_pending(current)”了解是不是信号唤醒的,如果是,理解返回“-ERESTARTSYS”.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
桑葚干直接吃还是泡水喝比较好桑葚干直接吃补肾吗 桑葚干泡水吃好还是干吃好 益智仁脑素神经酸片的功效与作用有哪些 黄冈师范学院师范专业有哪些 语文教育专业考研方向分析 黄冈师范学院语文教育专科毕业能拿教师资格证吗 php保留数字小数点后两位的方法 梦见被后咬 梦见母亲给赔鸡钱补了十二元的预兆 梦见门掉下来要二十五元修理费 驱动程序是不是进程? 如何让进程作为驱动运行 进程驱动的作用 怎么打开驱动程序 如何从驱动中启动应用程序 关于电脑显卡驱动进程的问题 中国乘着奥运的翅膀腾飞演讲稿 中华魂《祖国在我心中》演讲稿 要一篇祖国在我心中的演讲稿,快 祖国在我心中演讲稿!!急!!!今天就要!!! 腾飞吧!巨龙!的演讲稿怎么写啊??要描写祖国在我心中的,急急急... 急急!!!麻烦写个演讲稿 腾飞吧,巨龙!演讲稿450字 小学生爱国演讲稿腾飞吧,巨龙。 求《腾飞吧 中国》演讲稿 cad绘图区的图片放大了怎么缩小 cad图怎么缩小放大 英雄联盟里的进功标识咋按? 不小心在微信群发了不该发的图片怎么办 1844年经济学哲学手稿如何人的全面发展理论 如何打开被关闭的驱动程序 为什么我的驱动都显示在开机启动项里面,都是进程。 驱动程序怎么启动? 驱动精灵的进程是哪个? 玩传奇私服开CE,显示打开进程错误,怎么办? 阿瓦隆刺客叫什么 阿瓦隆刺客要睁眼吗 阿瓦隆刺客怎么刺人 《阿瓦隆》的规则是什么? 阿瓦隆任务成功条件 《阿瓦隆》中梅林应该怎么玩? 阿瓦隆规则梅林可以看谁 阿瓦隆5人局配置任务人数 10人阿瓦隆配置任务人数 《阿瓦隆》六人局规则是什么? 阿瓦隆桌游游戏规则是什么? 阿瓦隆平票怎么算 阿瓦隆莫甘娜能看到谁 阿瓦隆队长怎么选 阿瓦隆出票顺序