[Apue] использование Ctrl + S, чтобы остановить вывод без необходимости приостановить процесс переднего плана [apue] ждать для ребенка этих вещей

До было известно использовать Ctrl + Z Приостановить процесс переднего плана, чтобы остановить процесс работы, а затем переключиться на фоне процесса на первый план, так что вы можете продолжать работать через оболочку управления заданиями (работ / фг N).

Недавно мы узнали, новый подход к процессу переднего плана сохранил выходную консоль, вы можете использовать Ctrl + S, чтобы остановить вывод процесса, для того, чтобы приостановить процесс.

Вы можете перезапустить после (СНВ) процесса по выходу Ctrl + Q или ввод любого символа, чтобы продолжать работать.

 

Смотрите этот метод, сразу же думать, чтобы написать сценарий для теста:

deadloop.sh

1 #! / бен / ш 
2 вар = 1 
3 в  то время :
 4  делают 
5    эхо это $ вар
 6    вар = $ (($ Var + 1 ))
 7    USleep 100000 
8  сделано

 

Этот скрипт выводит журнал «это N» каждые 100 мс, где N является порядковым номером журнала, может помочь нам определить, между паузой и рестарта, если выход теряется.

Во время операции Нажмите CTRL + S, действительно приостановил выход:

> ./ deadloop.sh 
это 1 
это 2 
это 3 
это 4

 

 

Затем нажмите Ctrl + Q выход продолжается до тех пор, пока нажмите Ctrl + Z Приостановить процесс:

> ./ deadloop.sh 
это 1 
это 2 
это 3 
это 4 
это 5 
это 6 
это 7 
это 8 
это 9 
это 10 
это 11 
^ Z 
[1] + Stopped ./deadloop. ш 
>

 

 

Во-первых, вы можете увидеть выход после перезагрузки и серийный номер может быть подключен перед перезапуском, так что средний и нет потерь выходной, то есть этот процесс был приостановлен, а не только выход был остановлен.

Во-вторых, нажав Ctrl + Z Когда терминал будет отображать ^ Z, и нажмите Ctrl + S или Ctrl + Q, то терминал не имеет никакого эхо.

 

Таким образом, фокус контраста при нажатии Ctrl + S статуса, когда Z и Ctrl + процесс, разница между этими двумя способами подвешенной точки зрения.

Команда Ps для просмотра состояния как паузы процесса:

Ctrl + S

> Пс PID XFO, PPID, PGID, с.и.д., tpgid, SUID, EUID, пользователь, стат, терминал, команда 
ПИД PPID ПОЛЬЗОВАТЕЛЯ STAT ТТ КОМАНДА EUID SUID TPGID PGID SID 6653 6652 2786 2786 -1 500 500 Yunhai S? \ _ Gnome-псевдотерминал-хелперов 6655 6652 6655 6655 6655 500 500 Yunhai Ss + очки / 0 \ _ / бен / Баш 12539 6652 12539 12539 16673 500 из 500 Yunhai Ss очки / 1 \ _ / бен / Баш 16673 12539 16673 12539 16673 500 500 Yunhai S + очки / 1 | \ _ / Бен / ш deadloopsh 12797 6652 12797 12797 13349 500 500 Yunhai Сс очки / 2 \ _ / бен / Баш 16766 15959 16766 15959 16766 500 500 Yunhai R + PTS / 3 \ _ пс PID XFO, PPID, PGID Сида, tpgid, SUID, EUID , пользователь, стат, терминал, команда L5959 6652 L5959 L5959 L6766 500 500 Yunhai Ss Оч / 3 \ _ / бен / Баш

  

Ctrl + Z

> Пс PID XFO, PPID, PGID, с.и.д., tpgid, SUID, EUID, пользователь, стат, терминал, команда 
  ПИД PPID ПОЛЬЗОВАТЕЛЯ STAT ТТ КОМАНДА EUID SUID TPGID PGID SID 
 6653 6652 2786 2786 -1 500 500 Yunhai S? \ _ Gnome-псевдотерминал-хелперов 
 6655 6652 6655 6655 6655 500 500 Yunhai Ss + очки / 0 \ _ / бен / Баш 12539 6652 12539 12539 16717 500 из 500 Yunhai Ss очки / 1 \ _ / бен / Баш 16673 12539 16673 12539 16717 500 500 Yunhai T очки / 1 | \ _ / Bin / ш deadloopsh 
16688 16673 16673 12539 16717 500 500 T Yunhai очки / 1 | | \ _ USleep 100000 
16717 12539 16717 12539 16717 500 500 Yunhai R + очки / 1 | \ _ Ps XFO PID, PPID, PGID, с.и.д., tpgid, SUID, EUID, пользователь, стат, терминал, команда

 
L2797 6652 L2797 L2797 L3349 500 500 Yunhai Ss Оч / 2 \ _ / бен / Баш 
L5959 6652 L5959 L5959 L5959 500 500 Yunhai Ss + Оч / 3 \ _ / бен / Баш

 

 

Самое большое различие можно видеть, что в процессе Ctrl + Z остановленном состоянии в ожидании ( «T»), Ctrl + S останавливают процессы, протекающие состояние ( «S +»).

С другой стороны, мы начинаем Stap процесса обнаружения сигнала между приемопередатчиком, вы можете получить следующий результат, когда Ctrl + Z, чтобы остановить этот процесс:

stap_signal.sh

22 событий / 3 16688 USleep 20      SIGTSTP         
22 событий / 3 16673 deadloop.sh 20     SIGTSTP        
16673 12539 deadloop.sh Баш 17 SIGCHLD        
16688 16673 USleep deadloop.sh 17 SIGCHLD 

 

 

Это может быть наблюдаемыми сигналами процесса SIGTSTP, посланные от стойки регистрации. А при использовании Ctrl + S является не обнаружен конкретным сигнал (SIGCHILD посылается только родительский процесс USleep в конце процесса).

 

Примечание: SIGCHLD здесь не означает, что deadloop.sh и USleep конец, но уведомление отправляется в родительский процесс при зависании. В связи с этим, я могу сослаться на статью, написанную раньше:

[Apue] эти вещи ждут дочернего процесса

 

Во время паузы, два способа просмотра информации стеки процесса приостанавливаются pstack команды:

Ctrl + S

> pstack 16673 
# 0 0x00119424 в __kernel_vsyscall () 
# 1 0x007a7cd3 в __write_nocancel () из /lib/libc.so.6 
# 2 0x007411b4 в _IO_new_file_write () из /lib/libc.so.6 
# 3 0x00742a90 в _IO_new_do_write () из /lib/libc.so.6 
# 4 0x00741c80 в _IO_new_file_overflow () из /lib/libc.so.6 
# 5 0x00744b2a в __overflow () из /lib/libc.so.6 
# 6 0x0073e0b5 в putc () из / Lib /libc.so.6 
# 7 0x080aebb0 в echo_builtin () 
# 8 0x08070c51 в ?? () 
# 9 0x08072e41 в ?? () 
# 10 0x08073aa0 в execute_command_internal () 
# 11 0x080747a4 в execute_command () 
# 12 0x08076d89 в ?? () 
# 13 0x08073a02 в execute_command_internal ()
# 14 0x080747a4 в execute_command () 
# 15 0x08076d89 в ?? () 
# 16 0x08073a02 в execute_command_internal () 
# 17 0x080747a4 в execute_command () 
# 18 0x080750e4 в ?? () 
# 19 0x08073bc4 в execute_command_internal () 
# 20 0x080747a4 в execute_command () 
# 21 0x08060857 в reader_loop () 
# 22 0x0805fed9 в главной ()

 

 

Ctrl + Z

> pstack 16673 
# 0 0x00119424 в __kernel_vsyscall () 
# 1 0x00776673 в __waitpid_nocancel () из /lib/libc.so.6 
# 2 0x080830f2 в ?? () 
# 3 0x0808432e в wait_for () 
# 4 0x08074635 в execute_command_internal () 
# 5 0x08076dcd в ?? () 
# 6 0x08073a02 в execute_command_internal () 
# 7 0x080747a4 в execute_command () 
# 8 0x080750e4 в ?? () 
# 9 0x08073bc4 в execute_command_internal () 
# 10 0x080747a4 в execute_command () 
# 11 0x08060857 в reader_loop () 
# 12 0x0805fed9 в главной ()

 

 

Бывшая остановка на систему записи вызова, который остановился на waitpid системных вызовов.

Таким образом, первое должно быть приостановлено на выходе, в то время как последний приостанавливается в ожидании USleep дочернего процесса возвращения.

Вы можете испытать тонкое различие между этими двумя способами в.

 

Наконец, вы можете использовать гаджет Ctrl + S, чтобы остановить процесс на переднем плане помещение необходимо открыть терминал флаг IXON, перед использованием:

[Apue] небольшой инструмент для просмотра текущего набора терминала флага

 

Можно ли просматривать входной терминал флаг был открыт этот логотип:

> ./ Термин 
вход флаг 0x00006f02 
    BRKINT 
    ICRNL 
    IMAXBEL IXANY IXON 
Выходной флаг 0x00000005 
    ONLCR 
    OPOST 
управляющий флаг 0x000004bf 
    CREAD 
    CSIZE 
    CS6 
    CS7 
    CS8 
    HUPCL 
местного флага 0x00008a3b 
    ЭХО 
    ECHOE 
    ECHOK 
    ICANON 
    IEXTEN 
    ISIG
    
    

 

 

Генеральный терминал открыт. Если мы открыт флаг IXANY, вы можете использовать любую клавишу для перезагрузки остановленном выхода, но не должны использовать Ctrl + Q.

Наконец, есть скрытые предпосылки, что процесс был приостановлен на переднем плане существует частый выход или Ctrl + S тоже бесполезно.

 

Таким образом, сегодня узнал новый способ приостановить процесс переднего ход, эксплуатацию и техническое обслуживание для ветеранов, которые, возможно, были Shoudaoqinlai, для меня это совершенно свежего,

Так что я провел некоторое время, исследуя следующий, чувствуя линукс глубокое, скромное место может скрыть что-то хорошее, это стоит рыть!

 

рекомендация

отwww.cnblogs.com/goodcitizen/p/12233461.html