<b>Linux APM构造中函数实现</b>[Linux安全]
本文“<b>Linux APM构造中函数实现</b>[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
需求注意,Linux APM和acpi是彼此冲突的两个模块,用户在同一时间内只能加载此中之一,假如当他们在加载的时刻发现二者之一已经加载,就会自动退出.
Linux APM构造中函数实现
当一个用户进程翻开apm_bios设备时, 它就会调用这个函数
static int apm_open(struct inode * inode, struct file * filp)
{
//这个关键是Linux APM_user构造变量as,它是用户和Linux APM内核部份沟通的桥梁,当有Linux APM事件发生时,就把event挂到apm_user的queue上,这样当用户读时就会读到相关事件然后处理.
struct apm_user *as;
lock_kernel();
//分配一个Linux APM_user构造, 来表示一个用户进程
as = kzalloc(sizeof(*as), GFP_KERNEL);
//读写等权限设置
if (as) {
as->suser = capable(CAP_SYS_ADMIN);
as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE;
as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ;
//将这个用户加入用户行列
down_write(&user_list_lock);
list_add(&as->list, &apm_user_list);
up_write(&user_list_lock);
//这是一个传送私有数据的一个通用方法
filp->private_data = as;
}
unlock_kernel();
return as ? 0 : -ENOMEM;
}
当用户空间进程去读这个设备时, 这个函数就会被调用. 这个函数的主要作用是将事件读出到用户空间.
static ssize_t apm_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos)
{
struct apm_user *as = fp->private_data;
apm_event_t event;
int i = count, ret = 0;
if (count < sizeof(apm_event_t))
return -EINVAL;
//行列空, 且进程非阻塞读, 立即返回
if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK)
return -EAGAIN;
//不然等候到行列非空为止,
wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue));
//将行列中的事件复制给用户空间
while ((i >= sizeof(event)) && !queue_empty(&as->queue)) {
event = queue_get_event(&as->queue);
ret = -EFAULT;
if (copy_to_user(buf, &event, sizeof(event)))
break;
以上是“<b>Linux APM构造中函数实现</b>[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |