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

📄 tty_io.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
<a name=L265 href="source/kernel/chr_drv/tty_io.c?v=0.97#L265">265</a> <b><i> * We only request that a system call be restarted if there was if the </i></b><a name=L266 href="source/kernel/chr_drv/tty_io.c?v=0.97#L266">266</a> <b><i> * default signal handler is being used.  The reason for this is that if</i></b><a name=L267 href="source/kernel/chr_drv/tty_io.c?v=0.97#L267">267</a> <b><i> * a job is catching SIGTTIN or SIGTTOU, the signal handler may not want </i></b><a name=L268 href="source/kernel/chr_drv/tty_io.c?v=0.97#L268">268</a> <b><i> * the system call to be restarted blindly.  If there is no way to reset the</i></b><a name=L269 href="source/kernel/chr_drv/tty_io.c?v=0.97#L269">269</a> <b><i> * terminal pgrp back to the current pgrp (perhaps because the controlling</i></b><a name=L270 href="source/kernel/chr_drv/tty_io.c?v=0.97#L270">270</a> <b><i> * tty has been released on logout), we don't want to be in an infinite loop</i></b><a name=L271 href="source/kernel/chr_drv/tty_io.c?v=0.97#L271">271</a> <b><i> * while restarting the system call, and have it always generate a SIGTTIN</i></b><a name=L272 href="source/kernel/chr_drv/tty_io.c?v=0.97#L272">272</a> <b><i> * or SIGTTOU.  The default signal handler will cause the process to stop</i></b><a name=L273 href="source/kernel/chr_drv/tty_io.c?v=0.97#L273">273</a> <b><i> * thus avoiding the infinite loop problem.  Presumably the job-control</i></b><a name=L274 href="source/kernel/chr_drv/tty_io.c?v=0.97#L274">274</a> <b><i> * cognizant parent will fix things up before continuging its child process.</i></b><a name=L275 href="source/kernel/chr_drv/tty_io.c?v=0.97#L275">275</a> <b><i> */</i></b><a name=L276 href="source/kernel/chr_drv/tty_io.c?v=0.97#L276">276</a> int <a href="ident?v=0.97;i=tty_signal">tty_signal</a>(int sig, struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> *tty)<a name=L277 href="source/kernel/chr_drv/tty_io.c?v=0.97#L277">277</a> {<a name=L278 href="source/kernel/chr_drv/tty_io.c?v=0.97#L278">278</a>         (void) <a href="ident?v=0.97;i=kill_pg">kill_pg</a>(<a href="ident?v=0.97;i=current">current</a>-&gt;pgrp,sig,1);<a name=L279 href="source/kernel/chr_drv/tty_io.c?v=0.97#L279">279</a>         return -<a href="ident?v=0.97;i=ERESTARTSYS">ERESTARTSYS</a>;<a name=L280 href="source/kernel/chr_drv/tty_io.c?v=0.97#L280">280</a> }<a name=L281 href="source/kernel/chr_drv/tty_io.c?v=0.97#L281">281</a> <a name=L282 href="source/kernel/chr_drv/tty_io.c?v=0.97#L282">282</a> static void <a href="ident?v=0.97;i=wait_for_canon_input">wait_for_canon_input</a>(struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty)<a name=L283 href="source/kernel/chr_drv/tty_io.c?v=0.97#L283">283</a> {<a name=L284 href="source/kernel/chr_drv/tty_io.c?v=0.97#L284">284</a>         while (1) {<a name=L285 href="source/kernel/chr_drv/tty_io.c?v=0.97#L285">285</a>                 <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(tty);<a name=L286 href="source/kernel/chr_drv/tty_io.c?v=0.97#L286">286</a>                 if (tty-&gt;link)<a name=L287 href="source/kernel/chr_drv/tty_io.c?v=0.97#L287">287</a>                         if (tty-&gt;link-&gt;<a href="ident?v=0.97;i=count">count</a>)<a name=L288 href="source/kernel/chr_drv/tty_io.c?v=0.97#L288">288</a>                                 <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty-&gt;link);<a name=L289 href="source/kernel/chr_drv/tty_io.c?v=0.97#L289">289</a>                         else<a name=L290 href="source/kernel/chr_drv/tty_io.c?v=0.97#L290">290</a>                                 return;<a name=L291 href="source/kernel/chr_drv/tty_io.c?v=0.97#L291">291</a>                 if (<a href="ident?v=0.97;i=current">current</a>-&gt;signal &amp; ~current-&gt;blocked)<a name=L292 href="source/kernel/chr_drv/tty_io.c?v=0.97#L292">292</a>                         return;<a name=L293 href="source/kernel/chr_drv/tty_io.c?v=0.97#L293">293</a>                 if (<a href="ident?v=0.97;i=FULL">FULL</a>(tty-&gt;read_q))<a name=L294 href="source/kernel/chr_drv/tty_io.c?v=0.97#L294">294</a>                         return;<a name=L295 href="source/kernel/chr_drv/tty_io.c?v=0.97#L295">295</a>                 if (tty-&gt;secondary-&gt;data)<a name=L296 href="source/kernel/chr_drv/tty_io.c?v=0.97#L296">296</a>                         return;<a name=L297 href="source/kernel/chr_drv/tty_io.c?v=0.97#L297">297</a>                 <a href="ident?v=0.97;i=cli">cli</a>();<a name=L298 href="source/kernel/chr_drv/tty_io.c?v=0.97#L298">298</a>                 if (!tty-&gt;secondary-&gt;data)<a name=L299 href="source/kernel/chr_drv/tty_io.c?v=0.97#L299">299</a>                         <a href="ident?v=0.97;i=interruptible_sleep_on">interruptible_sleep_on</a>(&amp;tty-&gt;secondary-&gt;proc_list);<a name=L300 href="source/kernel/chr_drv/tty_io.c?v=0.97#L300">300</a>                 <a href="ident?v=0.97;i=sti">sti</a>();<a name=L301 href="source/kernel/chr_drv/tty_io.c?v=0.97#L301">301</a>         }<a name=L302 href="source/kernel/chr_drv/tty_io.c?v=0.97#L302">302</a> }<a name=L303 href="source/kernel/chr_drv/tty_io.c?v=0.97#L303">303</a> <a name=L304 href="source/kernel/chr_drv/tty_io.c?v=0.97#L304">304</a> static int <a href="ident?v=0.97;i=read_chan">read_chan</a>(unsigned int channel, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>, char * <a href="ident?v=0.97;i=buf">buf</a>, int nr)<a name=L305 href="source/kernel/chr_drv/tty_io.c?v=0.97#L305">305</a> {<a name=L306 href="source/kernel/chr_drv/tty_io.c?v=0.97#L306">306</a>         struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty;<a name=L307 href="source/kernel/chr_drv/tty_io.c?v=0.97#L307">307</a>         int c;<a name=L308 href="source/kernel/chr_drv/tty_io.c?v=0.97#L308">308</a>         char * b=<a href="ident?v=0.97;i=buf">buf</a>;<a name=L309 href="source/kernel/chr_drv/tty_io.c?v=0.97#L309">309</a>         int minimum,time;<a name=L310 href="source/kernel/chr_drv/tty_io.c?v=0.97#L310">310</a> <a name=L311 href="source/kernel/chr_drv/tty_io.c?v=0.97#L311">311</a>         if (channel &gt; 255)<a name=L312 href="source/kernel/chr_drv/tty_io.c?v=0.97#L312">312</a>                 return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L313 href="source/kernel/chr_drv/tty_io.c?v=0.97#L313">313</a>         tty = <a href="ident?v=0.97;i=TTY_TABLE">TTY_TABLE</a>(channel);<a name=L314 href="source/kernel/chr_drv/tty_io.c?v=0.97#L314">314</a>         if (!(tty-&gt;read_q &amp;&amp; tty-&gt;secondary))<a name=L315 href="source/kernel/chr_drv/tty_io.c?v=0.97#L315">315</a>                 return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L316 href="source/kernel/chr_drv/tty_io.c?v=0.97#L316">316</a>         if ((tty-&gt;pgrp &gt; 0) &amp;&amp;<a name=L317 href="source/kernel/chr_drv/tty_io.c?v=0.97#L317">317</a>             (<a href="ident?v=0.97;i=current">current</a>-&gt;tty == channel) &amp;&amp;<a name=L318 href="source/kernel/chr_drv/tty_io.c?v=0.97#L318">318</a>             (tty-&gt;pgrp != <a href="ident?v=0.97;i=current">current</a>-&gt;pgrp))<a name=L319 href="source/kernel/chr_drv/tty_io.c?v=0.97#L319">319</a>                 if (<a href="ident?v=0.97;i=is_ignored">is_ignored</a>(<a href="ident?v=0.97;i=SIGTTIN">SIGTTIN</a>) || <a href="ident?v=0.97;i=is_orphaned_pgrp">is_orphaned_pgrp</a>(<a href="ident?v=0.97;i=current">current</a>-&gt;pgrp))<a name=L320 href="source/kernel/chr_drv/tty_io.c?v=0.97#L320">320</a>                         return -<a href="ident?v=0.97;i=EIO">EIO</a>;<a name=L321 href="source/kernel/chr_drv/tty_io.c?v=0.97#L321">321</a>                 else<a name=L322 href="source/kernel/chr_drv/tty_io.c?v=0.97#L322">322</a>                         return(<a href="ident?v=0.97;i=tty_signal">tty_signal</a>(<a href="ident?v=0.97;i=SIGTTIN">SIGTTIN</a>, tty));<a name=L323 href="source/kernel/chr_drv/tty_io.c?v=0.97#L323">323</a>         if (<a href="ident?v=0.97;i=L_CANON">L_CANON</a>(tty))<a name=L324 href="source/kernel/chr_drv/tty_io.c?v=0.97#L324">324</a>                 minimum = time = <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = 0;<a name=L325 href="source/kernel/chr_drv/tty_io.c?v=0.97#L325">325</a>         else {<a name=L326 href="source/kernel/chr_drv/tty_io.c?v=0.97#L326">326</a>                 time = 10L*tty-&gt;<a href="ident?v=0.97;i=termios">termios</a>.c_cc[<a href="ident?v=0.97;i=VTIME">VTIME</a>];<a name=L327 href="source/kernel/chr_drv/tty_io.c?v=0.97#L327">327</a>                 minimum = tty-&gt;<a href="ident?v=0.97;i=termios">termios</a>.c_cc[<a href="ident?v=0.97;i=VMIN">VMIN</a>];<a name=L328 href="source/kernel/chr_drv/tty_io.c?v=0.97#L328">328</a>                 if (minimum)<a name=L329 href="source/kernel/chr_drv/tty_io.c?v=0.97#L329">329</a>                         <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = 0xffffffff;<a name=L330 href="source/kernel/chr_drv/tty_io.c?v=0.97#L330">330</a>                 else {<a name=L331 href="source/kernel/chr_drv/tty_io.c?v=0.97#L331">331</a>                         if (time)<a name=L332 href="source/kernel/chr_drv/tty_io.c?v=0.97#L332">332</a>                                 <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = time + <a href="ident?v=0.97;i=jiffies">jiffies</a>;<a name=L333 href="source/kernel/chr_drv/tty_io.c?v=0.97#L333">333</a>                         else<a name=L334 href="source/kernel/chr_drv/tty_io.c?v=0.97#L334">334</a>                                 <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = 0;<a name=L335 href="source/kernel/chr_drv/tty_io.c?v=0.97#L335">335</a>                         time = 0;<a name=L336 href="source/kernel/chr_drv/tty_io.c?v=0.97#L336">336</a>                         minimum = 1;<a name=L337 href="source/kernel/chr_drv/tty_io.c?v=0.97#L337">337</a>                 }<a name=L338 href="source/kernel/chr_drv/tty_io.c?v=0.97#L338">338</a>         }<a name=L339 href="source/kernel/chr_drv/tty_io.c?v=0.97#L339">339</a>         if (<a href="ident?v=0.97;i=file">file</a>-&gt;f_flags &amp; <a href="ident?v=0.97;i=O_NONBLOCK">O_NONBLOCK</a>)<a name=L340 href="source/kernel/chr_drv/tty_io.c?v=0.97#L340">340</a>                 time = <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = 0;<a name=L341 href="source/kernel/chr_drv/tty_io.c?v=0.97#L341">341</a>         else if (<a href="ident?v=0.97;i=L_CANON">L_CANON</a>(tty))<a name=L342 href="source/kernel/chr_drv/tty_io.c?v=0.97#L342">342</a>                 <a href="ident?v=0.97;i=wait_for_canon_input">wait_for_canon_input</a>(tty);<a name=L343 href="source/kernel/chr_drv/tty_io.c?v=0.97#L343">343</a>         if (minimum&gt;nr)<a name=L344 href="source/kernel/chr_drv/tty_io.c?v=0.97#L344">344</a>                 minimum = nr;<a name=L345 href="source/kernel/chr_drv/tty_io.c?v=0.97#L345">345</a>         while (nr&gt;0) {<a name=L346 href="source/kernel/chr_drv/tty_io.c?v=0.97#L346">346</a>                 <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(tty);<a name=L347 href="source/kernel/chr_drv/tty_io.c?v=0.97#L347">347</a>                 if (tty-&gt;link)<a name=L348 href="source/kernel/chr_drv/tty_io.c?v=0.97#L348">348</a>                         <a href="ident?v=0.97;i=TTY_WRITE_FLUSH">TTY_WRITE_FLUSH</a>(tty-&gt;link);<a name=L349 href="source/kernel/chr_drv/tty_io.c?v=0.97#L349">349</a>                 while (nr &gt; 0 &amp;&amp; ((c = <a href="ident?v=0.97;i=get_tty_queue">get_tty_queue</a>(tty-&gt;secondary)) &gt;= 0)) {<a name=L350 href="source/kernel/chr_drv/tty_io.c?v=0.97#L350">350</a>                         if ((<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty) != <a href="ident?v=0.97;i=__DISABLED_CHAR">__DISABLED_CHAR</a> &amp;&amp;<a name=L351 href="source/kernel/chr_drv/tty_io.c?v=0.97#L351">351</a>                              c==<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty)) || c==10)<a name=L352 href="source/kernel/chr_drv/tty_io.c?v=0.97#L352">352</a>                                 tty-&gt;secondary-&gt;data--;<a name=L353 href="source/kernel/chr_drv/tty_io.c?v=0.97#L353">353</a>                         if ((<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty) != <a href="ident?v=0.97;i=__DISABLED_CHAR">__DISABLED_CHAR</a> &amp;&amp;<a name=L354 href="source/kernel/chr_drv/tty_io.c?v=0.97#L354">354</a>                              c==<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty)) &amp;&amp; <a href="ident?v=0.97;i=L_CANON">L_CANON</a>(tty))<a name=L355 href="source/kernel/chr_drv/tty_io.c?v=0.97#L355">355</a>                                 break;<a name=L356 href="source/kernel/chr_drv/tty_io.c?v=0.97#L356">356</a>                         <a href="ident?v=0.97;i=put_fs_byte">put_fs_byte</a>(c,b++);<a name=L357 href="source/kernel/chr_drv/tty_io.c?v=0.97#L357">357</a>                         nr--;<a name=L358 href="source/kernel/chr_drv/tty_io.c?v=0.97#L358">358</a>                         if (time)<a name=L359 href="source/kernel/chr_drv/tty_io.c?v=0.97#L359">359</a>                                 <a href="ident?v=0.97;i=current">current</a>-&gt;timeout = time+<a href="ident?v=0.97;i=jiffies">jiffies</a>;<a name=L360 href="source/kernel/chr_drv/tty_io.c?v=0.97#L360">360</a>                         if (c==10 &amp;&amp; <a href="ident?v=0.97;i=L_CANON">L_CANON</a>(tty))<a name=L361 href="source/kernel/chr_drv/tty_io.c?v=0.97#L361">361</a>                                 break;<a name=L362 href="source/kernel/chr_drv/tty_io.c?v=0.97#L362">362</a>                 };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -