📄 65.html
字号:
<a name='L179'>
<a name='L180'><i><font color='green'>//// 等待按键。</font></i>
<a name='L181'><i><font color='green'>// 如果控制台的读队列缓冲区空则让进程进入可中断的睡眠状态。</font></i>
<a name='L182'><b>void</b>
<a name='L183'><a href='../R/728.html' title='Multiple refered from 2 places.'>wait_for_keypress</a> (<b>void</b>)
<a name='L184'><font color='red'>{</font>
<a name='L185'> <a href='../S/65.html#L153' title='Defined at 153 in kernel/chr_drv/tty_io.c.'>sleep_if_empty</a> (&tty_table[0].secondary);
<a name='L186'><font color='red'>}</font>
<a name='L187'>
<a name='L188'><i><font color='green'>//// 复制成规范模式字符序列。</font></i>
<a name='L189'><i><font color='green'>// 将指定tty 终端队列缓冲区中的字符复制成规范(熟)模式字符并存放在辅助队列(规范模式队列)中。</font></i>
<a name='L190'><i><font color='green'>// 参数:tty - 指定终端的tty 结构。</font></i>
<a name='L191'><b>void</b>
<a name='L192'><a href='../R/413.html' title='Multiple refered from 3 places.'>copy_to_cooked</a> (<b>struct</b> tty_struct *tty)
<a name='L193'><font color='red'>{</font>
<a name='L194'> <b>signed</b> <b>char</b> c;
<a name='L195'>
<a name='L196'><i><font color='green'>// 如果tty 的读队列缓冲区不空并且辅助队列缓冲区为空,则循环执行下列代码。</font></i>
<a name='L197'> <b>while</b> (!<a href='../S/38.html#L39' title='Defined at 39 in include/linux/tty.h.'>EMPTY</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->read_q) && !<a href='../S/38.html#L45' title='Defined at 45 in include/linux/tty.h.'>FULL</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary))
<a name='L198'> <font color='red'>{</font>
<a name='L199'><i><font color='green'>// 从队列尾处取一字符到c,并前移尾指针。</font></i>
<a name='L200'> <a href='../S/38.html#L49' title='Defined at 49 in include/linux/tty.h.'>GETCH</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->read_q, c);
<a name='L201'><i><font color='green'>// 下面对输入字符,利用输入模式标志集进行处理。</font></i>
<a name='L202'><i><font color='green'>// 如果该字符是回车符CR(13),则:若回车转换行标志CRNL 置位则将该字符转换为换行符NL(10);</font></i>
<a name='L203'><i><font color='green'>// 否则若忽略回车标志NOCR 置位,则忽略该字符,继续处理其它字符。</font></i>
<a name='L204'> <b>if</b> (c == 13)
<a name='L205'> <b>if</b> (<a href='../S/65.html#L52' title='Defined at 52 in kernel/chr_drv/tty_io.c.'>I_CRNL</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L206'> c = 10;
<a name='L207'> <b>else</b> <b>if</b> (<a href='../S/65.html#L53' title='Defined at 53 in kernel/chr_drv/tty_io.c.'>I_NOCR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L208'> <b>continue</b>;
<a name='L209'> <b>else</b>;
<a name='L210'><i><font color='green'>// 如果该字符是换行符NL(10)并且换行转回车标志NLCR 置位,则将其转换为回车符CR(13)。</font></i>
<a name='L211'> <b>else</b> <b>if</b> (c == 10 && <a href='../S/65.html#L51' title='Defined at 51 in kernel/chr_drv/tty_io.c.'>I_NLCR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L212'> c = 13;
<a name='L213'><i><font color='green'>// 如果大写转小写标志UCLC 置位,则将该字符转换为小写字符。</font></i>
<a name='L214'> <b>if</b> (<a href='../S/65.html#L50' title='Defined at 50 in kernel/chr_drv/tty_io.c.'>I_UCLC</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L215'> c = <a href='../S/27.html#L32' title='Defined at 32 in include/ctype.h.'>tolower</a> (c);
<a name='L216'><i><font color='green'>// 如果本地模式标志集中规范(熟)模式标志CANON 置位,则进行以下处理。</font></i>
<a name='L217'> <b>if</b> (<a href='../S/65.html#L41' title='Defined at 41 in kernel/chr_drv/tty_io.c.'>L_CANON</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L218'> <font color='red'>{</font>
<a name='L219'><i><font color='green'>// 如果该字符是键盘终止控制字符KILL(^U),则进行删除输入行处理。</font></i>
<a name='L220'> <b>if</b> (c == <a href='../S/38.html#L59' title='Defined at 59 in include/linux/tty.h.'>KILL_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L221'> <font color='red'>{</font>
<a name='L222'><i><font color='green'>/* deal with killing the input line */</font></i><i><font color='green'>/* 删除输入行处理 */</font></i>
<a name='L223'><i><font color='green'>// 如果tty 辅助队列不空,或者辅助队列中最后一个字符是换行NL(10),或者该字符是文件结束字符</font></i>
<a name='L224'><i><font color='green'>// (^D),则循环执行下列代码。</font></i>
<a name='L225'> <b>while</b> (!(<a href='../S/38.html#L39' title='Defined at 39 in include/linux/tty.h.'>EMPTY</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary) ||
<a name='L226'> (c = <a href='../S/38.html#L43' title='Defined at 43 in include/linux/tty.h.'>LAST</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary)) == 10 ||
<a name='L227'> c == <a href='../S/38.html#L60' title='Defined at 60 in include/linux/tty.h.'>EOF_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>)))
<a name='L228'> <font color='red'>{</font>
<a name='L229'><i><font color='green'>// 如果本地回显标志ECHO 置位,那么:若字符是控制字符(值<32),则往tty 的写队列中放入擦除</font></i>
<a name='L230'><i><font color='green'>// 字符ERASE。再放入一个擦除字符ERASE,并且调用该tty 的写函数。</font></i>
<a name='L231'> <b>if</b> (<a href='../S/65.html#L43' title='Defined at 43 in kernel/chr_drv/tty_io.c.'>L_ECHO</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L232'> <font color='red'>{</font>
<a name='L233'> <b>if</b> (c < 32)
<a name='L234'> <a href='../S/38.html#L52' title='Defined at 52 in include/linux/tty.h.'>PUTCH</a> (127, <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q);
<a name='L235'> <a href='../S/38.html#L52' title='Defined at 52 in include/linux/tty.h.'>PUTCH</a> (127, <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q);
<a name='L236'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>);
<a name='L237'> <font color='red'>}</font>
<a name='L238'><i><font color='green'>// 将tty 辅助队列头指针后退1 字节。</font></i>
<a name='L239'> <a href='../S/38.html#L37' title='Defined at 37 in include/linux/tty.h.'>DEC</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary.head);
<a name='L240'> <font color='red'>}</font>
<a name='L241'> <b>continue</b>; <i><font color='green'>// 继续读取并处理其它字符。</font></i>
<a name='L242'> <font color='red'>}</font>
<a name='L243'><i><font color='green'>// 如果该字符是删除控制字符ERASE(^H),那么:</font></i>
<a name='L244'> <b>if</b> (c == <a href='../S/38.html#L58' title='Defined at 58 in include/linux/tty.h.'>ERASE_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L245'> <font color='red'>{</font>
<a name='L246'><i><font color='green'>// 若tty 的辅助队列为空,或者其最后一个字符是换行符NL(10),或者是文件结束符,继续处理</font></i>
<a name='L247'><i><font color='green'>// 其它字符。</font></i>
<a name='L248'> <b>if</b> (<a href='../S/38.html#L39' title='Defined at 39 in include/linux/tty.h.'>EMPTY</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary) ||
<a name='L249'> (c = <a href='../S/38.html#L43' title='Defined at 43 in include/linux/tty.h.'>LAST</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary)) == 10 || c == <a href='../S/38.html#L60' title='Defined at 60 in include/linux/tty.h.'>EOF_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L250'> <b>continue</b>;
<a name='L251'><i><font color='green'>// 如果本地回显标志ECHO 置位,那么:若字符是控制字符(值<32),则往tty 的写队列中放入擦除</font></i>
<a name='L252'><i><font color='green'>// 字符ERASE。再放入一个擦除字符ERASE,并且调用该tty 的写函数。</font></i>
<a name='L253'> <b>if</b> (<a href='../S/65.html#L43' title='Defined at 43 in kernel/chr_drv/tty_io.c.'>L_ECHO</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L254'> <font color='red'>{</font>
<a name='L255'> <b>if</b> (c < 32)
<a name='L256'> <a href='../S/38.html#L52' title='Defined at 52 in include/linux/tty.h.'>PUTCH</a> (127, <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q);
<a name='L257'> <a href='../S/38.html#L52' title='Defined at 52 in include/linux/tty.h.'>PUTCH</a> (127, <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q);
<a name='L258'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>);
<a name='L259'> <font color='red'>}</font>
<a name='L260'><i><font color='green'>// 将tty 辅助队列头指针后退1 字节,继续处理其它字符。</font></i>
<a name='L261'> <a href='../S/38.html#L37' title='Defined at 37 in include/linux/tty.h.'>DEC</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->secondary.head);
<a name='L262'> <b>continue</b>;
<a name='L263'> <font color='red'>}</font>
<a name='L264'><i><font color='green'>//如果该字符是停止字符(^S),则置tty 停止标志,继续处理其它字符。</font></i>
<a name='L265'> <b>if</b> (c == <a href='../S/38.html#L62' title='Defined at 62 in include/linux/tty.h.'>STOP_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L266'> <font color='red'>{</font>
<a name='L267'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->stopped = 1;
<a name='L268'> <b>continue</b>;
<a name='L269'> <font color='red'>}</font>
<a name='L270'><i><font color='green'>// 如果该字符是停止字符(^Q),则复位tty 停止标志,继续处理其它字符。</font></i>
<a name='L271'> <b>if</b> (c == <a href='../S/38.html#L61' title='Defined at 61 in include/linux/tty.h.'>START_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L272'> <font color='red'>{</font>
<a name='L273'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->stopped = 0;
<a name='L274'> <b>continue</b>;
<a name='L275'> <font color='red'>}</font>
<a name='L276'> <font color='red'>}</font>
<a name='L277'><i><font color='green'>// 若输入模式标志集中ISIG 标志置位,则在收到INTR、QUIT、SUSP 或DSUSP 字符时,需要为进程</font></i>
<a name='L278'><i><font color='green'>// 产生相应的信号。</font></i>
<a name='L279'> <b>if</b> (<a href='../S/65.html#L42' title='Defined at 42 in kernel/chr_drv/tty_io.c.'>L_ISIG</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L280'> <font color='red'>{</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -