[APUE 사용시 Ctrl 키 + S는 그런 것들의 아이 [APUE] 대기 전경 처리를 중단하지 않고 출력을 정지

이전에 실행중인 프로세스를 중지 전경 프로세스를 일시 중단 Ctrl + Z를 사용하는 것으로 알려져있다, 다음, 그래서 당신은 작업 제어 (작업 / FG의 N)의 쉘을 통해 계속 실행할 수있는, 전경에 백그라운드 프로세스로 전환합니다.

최근에 우리는 포 그라운드 프로세스에 대한 새로운 접근 방식은 당신이 과정을 중지하기 위해, 프로세스의 STOP 출력하려면 Ctrl + S를 사용하여 출력 콘솔을 유지하고있다 배웠다.

Ctrl 키 + Q 출력 또는 입력하여 (START) 프로세스를 계속 실행하는 모든 문자 후 다시 시작할 수 있습니다.

 

바로 테스트 스크립트를 작성하는 생각이 방법을 참조하십시오 :

deadloop.sh

1 #! / 빈 / SH 
2 VAR = 1 
3  동안 :
 4  
5    반향 이 $ VAR이다
 6    VAR = $ (($ VAR + 1 ))
 7    usleep 100000 
8  수행

 

이 스크립트는 N 로그 시퀀스 번호입니다 로그 "이 N이다"매 100 밀리, 출력, 출력이 손실 된 경우 우리가 일시 중지하고 다시 시작 사이에 확인하는 데 도움이 될 수 있습니다.

작업에서 Ctrl + S 동안, 실제로 출력을 중단 :

> ./ deadloop.sh 
이것은 1
이 2
이 3
이것은 4

 

 

당신은 Ctrl + Z 프로세스를 일시 중단 누를 때까지 Ctrl 키 + Q 출력은 계속된다 :

> ./ deadloop.sh 
이것은 1
이 2
이 3
이것은 4
이 5
이 6이고
이 7
이 8
이 9입니다
이 10
이 11
^ Z
[1] + 중지 ./deadloop.sh
>

 

 

첫째, 당신은, 다시 시작 및 일련 번호 후 출력이 다시 시작하기 전에 연결할 수 있습니다 참조 중간 그래서 프로세스가 일시 중단 된 단지 출력이 중단 된없는 말을하는 것입니다 더 출력 손실이 없다 할 수 있습니다.

단말은 ^ Z를 표시하면 둘째 Ctrl + Z를 누르면하고 Ctrl + S 또는 Ctrl + Q는, 상기 터미널은 임의의 반향이 없다.

 

콘트라스트 포커스 그래서 Ctrl 키 + S 상태를 누르면 때 Ctrl 키와 Z +에있어서, 도면의 중단 지점이 두 방법의 차이.

ps 명령은 모두 일시 정지 프로세스의 상태를 볼 수 있습니다 :

Ctrl 키 + S

> PS xfo PID, PPID, pgid와, SID, tpgid 남쪽 EUID, 사용자, STAT, TTY 명령 
PID PPID PGID SID TPGID SOUTH EUID 사용자 STAT AT COMMAND 6653 6652 2786 2786 -1,500,500 Yunhai S? \ _ 그놈 PTY 헬퍼 6655 6652 6655 6655 6655 500 500 yunhai SS + PTS / 0 \ _ / 빈 / 떠들썩한 파티 6,652 12,539 12,539 12,539 16,673 500 500 yunhai SS의 PTS / 1 \ _ / 빈 / 떠들썩한 파티 16673 12539 16673 12539 16673 500 500 yunhai S + pts / 1 | \ _ / bin / sh ./deadloop.sh 12,797 6,652 12,797 12,797 13,349 500 500 yunhai SS의 점 / 2 \ _ / 빈 / bash는 15,959 6,652 15,959 15,959 16,766 500 500 yunhai SS의 점 / 3 \ _ / 빈 / bash는 16,766 15,959 16,766 15,959 16,766 500 500 yunhai R + PTS / 3 \ _ PS xfo PID, PPID, pgid와, SID, tpgid, SUID, EUID, 사용자, STAT, TTY, 명령

  

Ctrl + Z

> PS xfo PID, PPID, pgid와, SID, tpgid, SUID, EUID, 사용자, STAT, TTY, 명령
  PID PPID PGID SID TPGID SOUTH EUID 사용자 STAT AT COMMAND
 6653 6652 2786 2786 -1,500,500 Yunhai S? \ _ 그놈 PTY 헬퍼
 6655 6652 6655 6655 6655 500 500 yunhai SS + PTS / 0 \ _ / 빈 / 떠들썩한 파티
12539 6652 12539 12539 16717 500 500 yunhai Ss pts / 1 \ _ / bin / bash 
16673 12539 16673 12539 16717 500 500 yunhai T pts / 1 | \ _ / bin / sh ./deadloop.sh
16688 16673 16673 12539 16717 500 500 yunhai T pts / 1 | | \ _ usleep 100000
16717 12539 16717 12539 16717 500 500 yunhai의 R + 점 / 1 | \ _ PS xfo PID, PPID, pgid와, SID, tpgid, SUID, EUID, 사용자, STAT, TTY, 명령
12,797 6,652 12,797 12,797 13,349 500 500 yunhai SS의 점 / 2 \ _ / 빈 / bash는
6,652 15,959 15,959 15,959 15,959 500 500 yunhai SS + PTS / 3 \ _ / 빈 / 떠들썩한 파티

 

 

가장 큰 차이점은 Ctrl + Z의 방법에 의해 ( 'T')을 보류 상태로 정지 함을 알 수있다에서 Ctrl + S 상태 ( '+ S')을 실행하는 방법에 의해 정지된다.

Ctrl + Z는 프로세스를 중지 할 때 다른 한편으로, 우리는 트랜시버 신호 사이에 STAP 감지 프로세스를 시작, 당신은 다음과 같은 출력을받을 수 있습니다 :

stap_signal.sh

이벤트 (22) / (3) 20 16,688 usleep      SIGTSTP         
22 이벤트 / 3 20 16,673 deadloop.sh     SIGTSTP        
16,673 12,539 deadloop.sh 떠들썩한 파티 SIGCHLD 17        
16,688 16,673 usleep deadloop.sh 17 SIGCHLD 

 

 

즉, 프런트로부터 송신 된 관측 SIGTSTP 신호를 처리 할 수있다. 그리고 당신이 사용하는 Ctrl 키 + S는 (SIGCHILD는 프로세스의 마지막에 부모 프로세스 usleep로 전송) 특별한 신호가 감지되지 않을 수 있습니다.

 

참고 : SIGCHLD 여기 없어 평균 deadloop.sh와 usleep 끝 않지만, 중단 할 때 알림이 부모 프로세스로 전송됩니다. 이 점에서, 나는 이전에 작성된 기사를 참조 할 수 있습니다 :

[APUE] 그 일이 자식 프로세스를 기다리는

 

일시 정지하는 동안, 프로세스 스택 정보를 볼 수있는 두 가지 방법은 pstack을 명령으로 일시 중단됩니다 :

Ctrl 키 + S

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

 

 

Ctrl + Z

>의 pstack 16673
__kernel_vsyscall에서 # 0 0x00119424 ()
# 1에 0x00776673 __waitpid_nocancel /lib/libc.so.6 ()에서
# 2 0x080830f2 ?? ()
wait_for에서 # 3 0x0808432e ()
execute_command_internal에서 # 4 0x08074635 ()
# 5 0x08076dcd에 ?? ()
execute_command_internal에서 # 6 0x08073a02 ()
execute_command에 # 7 0x080747a4 ()
# 8 0x080750e4 ?? ()
execute_command_internal에서 # 9 0x08073bc4 ()
execute_command에서 # 10 0x080747a4 ()
reader_loop에서 # 11 0x08060857 ()
주에서 # 12 0x0805fed9 ()

 

 

waitpid를 시스템 호출에 중단 write 시스템 호출에 전자 중지합니다.

반환에 usleep 자식 프로세스를 기다리는 동안 후자가 일시 중단 된 동안 따라서, 전자는, 출력에 중단해야한다.

당신은이 두 가지 방법 사이의 미묘한 차이를 경험할 수 있습니다.

 

마지막으로, 당신은 사용하기 전에, IXON 플래그 터미널을 열 필요 전경 프로세스 전제를 중지 가제트 Ctrl 키 + S를 사용할 수 있습니다 :

[APUE]는 작은 도구는 현재 단말 플래그 세트를 볼

 

나는 플래그의 입력 단자는이 로고를 개설되었습니다 볼 수 있습니다 :

> ./ 용어
입력 플래그 0x00006f02
    BRKINT
    ICRNL
    IMAXBEL
    IXANY 
    IXON
출력 플래그 0x00000005
    ONLCR
    OPOST
제어 플래그 0x000004bf
    CREAD
    CSIZE
    CS6
    CS7
    CS8
    HUPCL
지역 플래그 0x00008a3b
    에코
    피드백
    ECHOK
    Ichhanon
    IEXTEN
    ICY

 

 

일반 터미널은 열려 있습니다. 우리는 열린 IXANY 플래그 경우 정지 출력을 다시 시작하려면 아무 키나를 사용할 수 있지만 Ctrl 키 + Q를 사용할 필요가 없습니다

마지막으로, 프로세스가 자주 출력은, 또는 Ctrl + S는 쓸모가 전경에 현탁시키고있는 숨겨진 전제가있다.

 

요약하면, 오늘은 신선한 완전히 나를 위해, Shoudaoqinlai를되었을 수도 참전 용사에 대 한 전경 실행중인 프로세스, 운영 및 유지 보수를 중단 할 수있는 새로운 방법을 배웠다

나는 깊은 겸손 장소 힘 숨기기 뭔가 좋은 리눅스 느낌, 다음 연구 시간을 보냈다 그래서, 그것은 파고 가치가 있습니다!

 

추천

출처www.cnblogs.com/goodcitizen/p/12233461.html