INK study

<프로세스 그룹>

  • 각 프로세스는 하나의 프로세스 그룹에 속한다
    • 기본적으로 자식은 부모와 같은 그룹에 속한다
    • 쉘은 각 job마다 별도의 프로세스 그룹을 만든다
  • 양수 프로세스 그룹 ID로 식별함 (process group ID)
  • 시그널 처리할 때 프로세스 그룹 관리하는 이유 : job으로 먼저 등록 , 한줄에 여러개의 명령어 침
  • 한 줄에 들어오는 모든 명령어 = 하나의 job → 자식을 만들면 groupID같다
  • foreground job은 키보드 작업 수행 가능 ctrl c
  • background 는 키보드 불가 ctrl c안먹음

💡 getpgrp() : 프로세스의 프로세스 그룹을 리턴

 

💡 setpgid() : 프로세스의 그룹을 변경 (성공하면 0, 실패 시 -1)

 

🧐kill → 시그널 보내기

/bin/kill

: 프로세스 또는 프로세스 그룹에 임의의 시그널 송신

ex. kill -9 24818

→ 프로세스 24818에 SIGKILL보냄

kill -9 24817

→ 프로세스 그룹 아이디 24817의 각 프로세스에 SIGKILL 보냄

(pgrp = 24817이다.)

  • kill 함수로 시그널 보냄#include <signal.h>
    • pid > 0 : kill함수는 시그널 번호 sig를 프로세스 pid로 보냄
    • pid = 0 : kill은 호출하는 프로세스인 자신을 포함해서 프로세스 그룹 내 모든 프로세스에 시그널sig를 보냄
    • pid<0 : kill은 시그널 sig를 프로세스 그룹 |PID| (PID의 절대값) 내의 모든 프로세스로 보낸다
  • int kill (pid_t pid, int sig);
  • #include <sys/types.h>

🧐ctrl-c, ctrl-z → 키보드로 시그널 보내기

  • 키보드로 ctrl-c(ctrl-z)누르면 SIGINT (SIGTSTP) 시그널이 포그라운드 프로세스 그룹의 모든 작업으로 전송된다.</aside></aside>
  • <aside> 💡 SIGTSTP - 기본 동작은 각 프로세스를 정지
  • <aside> 💡 SIGINT - 기본 동작은 각 프로세스를 모두 종료
  • ctrl -z 누르면 ? → 무한 루프 돌던 프로세스가 커서 깜빡거림 → foreground에서 돌고있는 job을 stop = SIGTSTP → running 상태에서 suspend상태로

<aside> 💡 FG process는 user input과 연결되어있다.

</aside>

<시그널 받기>

  • 커널이 예외처리 핸들러에서 돌아오고 있고, 제어권을 프로세스 p로 넘겨줄 준비가 되었다고 가정한다.
  • 커널은 pnb = pending & ~blocked을 계산
    • 프로세스 p의 블록되지 않은 시그널들을 표시

if (pnb == 0) : 할일이 없다는것

  • 프로세스 p의 논리적인 제어흐름상의 다음 인스트럭션으로 제어권을 이동
  • loof를 돈다

else

  • pnb에서 0이 아닌 k번째 비트를 선택하고 프로세스 p가 시그널 k를 수신하도록 한다
  • 시그널을 수신하면, 프로세스 p는 시그널 처리 작업을 수행
  • pnb의 모든 0이 아닌 k번째 비트들에 대해 위 과정을 반복
  • 제어권을 프로세스 p의 논리적 제어흐름 상의 인스트럭션으로 넘겨줌

<기본동작>

  • 각 시그널 타입은 사전에 정의된 기본동작을 가진다.
    • 프로세스가 종료
    • 프로세스가 종료, core파일 덤프
    • 프로세스가 SIGCONT 시그널에 의해 실행이 재개될 때까지 정지
    • 프로세스는 이 시그널 무시 (ignore)
  • 기본 동작은 signal()함수를 이용해서 변경이 가능 (SIGSTOP , SIGKILL) 예외
profile

INK study

@ongsimi_

읽어주셔서 감사합니다!