📄 047_fs_ioctl_c.html
字号:
<html lang="zh-CN" xmlns:gdoc=""> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <style type="text/css">/* default css */table { font-size: 1em; line-height: inherit;}div, address, ol, ul, li, option, select { margin-top: 0px; margin-bottom: 0px;}p { margin: 0px;}body { margin: 0px; padding: 0px; font-family: Verdana, sans-serif; font-size: 10pt; background-color: #ffffff;}h6 { font-size: 10pt }h5 { font-size: 11pt }h4 { font-size: 12pt }h3 { font-size: 13pt }h2 { font-size: 14pt }h1 { font-size: 16pt }blockquote {padding: 10px; border: 1px #DDD dashed }a img {border: 0}div.google_header, div.google_footer { position: relative; margin-top: 1em; margin-bottom: 1em;}/* end default css */ /* default print css */ @media print { body { padding: 0; margin: 0; } div.google_header, div.google_footer { display: block; min-height: 0; border: none; } div.google_header { flow: static(header); } /* used to insert page numbers */ div.google_header::before, div.google_footer::before { position: absolute; top: 0; } div.google_footer { flow: static(footer); } /* always consider this element at the start of the doc */ div#google_footer { flow: static(footer, start); } span.google_pagenumber { content: counter(page); } span.google_pagecount { content: counter(pages); } } @page { @top { content: flow(header); } @bottom { content: flow(footer); } } /* end default print css */ /* custom css *//* end custom css */ /* ui edited css */ body { font-family: Verdana; font-size: 10.0pt; line-height: normal; background-color: #ffffff; } .documentBG { background-color: #ffffff; } /* end ui edited css */</style> </head> <body revision="dcbsxfpf_70hpt425gr:19"> <div align=center id=ysv6>
<table align=center border=0 cellpadding=0 cellspacing=0 height=5716 id=rp9o width=800>
<tbody id=uc78>
<tr id=r093>
<td height=5716 id=kjk2 valign=top width=100%>
<pre id=q71e>2008-1-3 <br id=yjcd><br id=w4.s>man ioctl可能是了解这个文件内容的最直接方式.这里的实现也就是case .....做不同处理. 而处理本身分布在内核的各个角落.<br id=w15b><br id=db26>一般一个设备文件会实现fops->ioctl接口,参数由各个设备驱动自己定义. 比如block dev的ioctl就是调用对应blk设备的ioctl接口.<br id=vf.5><br id=qrt6>static int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,<br id=xq9g> unsigned long arg)<br id=jz_5>{<br id=o.7k> if (inode->i_bdev->bd_op->ioctl)<br id=o.a9> return inode->i_bdev->bd_op->ioctl(inode, file, cmd, arg);<br id=u82p> return -EINVAL;<br id=crd7>}<br id=wcx1>文件里就两个函数,列到这里吧.<br id=b4mr><br id=p.58>static int<font color=#000066 id=xb:2><b id=nw45> file_ioctl</b></font>(struct file *filp,unsigned int cmd,unsigned long arg)<br id=dvcs>{<br id=dlkx> int error;<br id=r3gh> int block;<br id=a-4l> struct inode * inode = filp->f_dentry->d_inode;<br id=t1jh><br id=dxgf> switch (cmd) {<br id=kyte> case <font color=#cc0000 id=k6o2>FIBMAP</font>:<br id=e4.5> {<br id=uuy.> struct address_space *mapping = inode->i_mapping;<br id=nq6f> int res;<br id=xstt> /* do we support this mess? */<br id=w9sk> if (!mapping->a_ops->bmap)<br id=kn9v> return -EINVAL;<br id=k_bx> if (!capable(CAP_SYS_RAWIO))<br id=ws8o> return -EPERM;<br id=x-8.> if ((error = get_user(block, (int *) arg)) != 0)<br id=h8y8> return error;<br id=ad73><br id=nmzt> res = <font color=#006600 id=ebpq>mapping->a_ops->bmap</font>(mapping, block);<br id=nf_w> return put_user(res, (int *) arg);<br id=gqzn> }<br id=ho1g> case <font color=#cc0000 id=xa4i>FIGETBSZ</font>:<br id=l53w> if (inode->i_sb == NULL)<br id=iycd> return -EBADF;<br id=k_e7> return put_user(inode->i_sb->s_blocksize, (int *) arg);<br id=z760> case <font color=#ff0000 id=c_bi>FIONREAD</font>:<br id=bq96> return put_user(inode->i_size - filp->f_pos, (int *) arg);<br id=wz-s> }<br id=j_80> if (filp->f_op && filp->f_op->ioctl)<br id=buep> return <font color=#006600 id=ps:s>filp->f_op->ioctl</font>(inode, filp, cmd, arg);<br id=bem2> return -ENOTTY;<br id=wd_d>}<br id=j4vy><br id=by4g><br id=w6ef>asmlinkage long <font color=#000099 id=kt1b><b id=ij9g>sys_ioctl</b></font>(unsigned int fd, unsigned int cmd, unsigned long arg)<br id=vres>{ <br id=u9x1> struct file * filp;<br id=r4kp> unsigned int flag;<br id=bqal> int on, error = -EBADF;<br id=jege><br id=h_.i> filp = fget(fd);<br id=rrf2> if (!filp)<br id=sb-s> goto out;<br id=cr_5> error = 0;<br id=xdgz> lock_kernel();<br id=rce:> switch (cmd) {<br id=klsr> case <font color=#cc0000 id=q0gk>FIOCLEX</font>:<br id=f656> set_close_on_exec(fd, 1);<br id=vw6d> break;<br id=m_os><br id=k5rw> case <font color=#cc0000 id=tp:o>FIONCLEX</font>:<br id=queu> set_close_on_exec(fd, 0);<br id=pf2b> break;<br id=pd:3><br id=h8bg> case <font color=#cc0000 id=hi7x>FIONBIO</font>:<br id=e5hd> if ((error = get_user(on, (int *)arg)) != 0)<br id=gicw> break;<br id=zrq_> flag = O_NONBLOCK;<br id=vi5r>#ifdef __sparc__<br id=npqh> /* SunOS compatibility item. */<br id=k_q4> if(O_NONBLOCK != O_NDELAY)<br id=qz_-> flag |= O_NDELAY;<br id=ud:9>#endif<br id=bj4w> if (on)<br id=u1g9> filp->f_flags |= flag;<br id=p-i9> else<br id=eggd> filp->f_flags &= ~flag;<br id=u7qv> break;<br id=hxkk><br id=to7z> case <font color=#cc0000 id=z23u>FIOASYNC</font>:<br id=szm7> if ((error = get_user(on, (int *)arg)) != 0)<br id=uv3i> break;<br id=uqjs> flag = on ? FASYNC : 0;<br id=o3h0><br id=neaq> /* Did FASYNC state change ? */<br id=iurf> if ((flag ^ filp->f_flags) & FASYNC) {<br id=f3qj> if (filp->f_op && filp->f_op->fasync)<br id=f6yh> error = filp->f_op->fasync(fd, filp, on);<br id=lx4q> else error = -ENOTTY;<br id=zzlw> }<br id=uc9s> if (error != 0)<br id=rqzz> break;<br id=qjkx><br id=j0tu> if (on)<br id=xlpx> filp->f_flags |= FASYNC;<br id=zpx0> else<br id=z_65> filp->f_flags &= ~FASYNC;<br id=pv.k> break;<br id=k5j6><br id=exq5> default:<br id=e7d7> error = -ENOTTY;<br id=x6os> if (S_ISREG(filp->f_dentry->d_inode->i_mode))<br id=ol_t> error = file_ioctl(filp, cmd, arg);<br id=kclb> else if (filp->f_op && filp->f_op->ioctl)<br id=maw-> error = <font color=#006600 id=f:kn>filp->f_op->ioctl</font>(filp->f_dentry->d_inode, filp, cmd, arg);<br id=i:8n> }<br id=cc57> unlock_kernel();<br id=nqc0> fput(filp);<br id=lo-p><br id=wf9c>out:<br id=vz58> return error;<br id=tlug>}<br id=e-e9><br id=k0se></pre>
</td>
</tr>
</tbody>
</table>
</div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -