⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 047_fs_ioctl_c.html

📁 重读linux 2.4.2o所写的笔记
💻 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-&gt;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-&gt;i_bdev-&gt;bd_op-&gt;ioctl)<br id=o.a9>		return inode-&gt;i_bdev-&gt;bd_op-&gt;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-&gt;f_dentry-&gt;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-&gt;i_mapping;<br id=nq6f>			int res;<br id=xstt>			/* do we support this mess? */<br id=w9sk>			if (!mapping-&gt;a_ops-&gt;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-&gt;a_ops-&gt;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-&gt;i_sb == NULL)<br id=iycd>				return -EBADF;<br id=k_e7>			return put_user(inode-&gt;i_sb-&gt;s_blocksize, (int *) arg);<br id=z760>		case <font color=#ff0000 id=c_bi>FIONREAD</font>:<br id=bq96>			return put_user(inode-&gt;i_size - filp-&gt;f_pos, (int *) arg);<br id=wz-s>	}<br id=j_80>	if (filp-&gt;f_op &amp;&amp; filp-&gt;f_op-&gt;ioctl)<br id=buep>		return <font color=#006600 id=ps:s>filp-&gt;f_op-&gt;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-&gt;f_flags |= flag;<br id=p-i9>			else<br id=eggd>				filp-&gt;f_flags &amp;= ~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-&gt;f_flags) &amp; FASYNC) {<br id=f3qj>				if (filp-&gt;f_op &amp;&amp; filp-&gt;f_op-&gt;fasync)<br id=f6yh>					error = filp-&gt;f_op-&gt;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-&gt;f_flags |= FASYNC;<br id=zpx0>			else<br id=z_65>				filp-&gt;f_flags &amp;= ~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-&gt;f_dentry-&gt;d_inode-&gt;i_mode))<br id=ol_t>				error = file_ioctl(filp, cmd, arg);<br id=kclb>			else if (filp-&gt;f_op &amp;&amp; filp-&gt;f_op-&gt;ioctl)<br id=maw->				error = <font color=#006600 id=f:kn>filp-&gt;f_op-&gt;ioctl</font>(filp-&gt;f_dentry-&gt;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 + -