Linux - SIGTERM, SIGINT

wldbs._.·2024년 11월 19일
1

SW

목록 보기
3/8
post-thumbnail

리눅스 프로그래밍 - 프로그램 종료 신호
ctrl+c와 ctrl+z의 차이점
리눅스 시그널 알아보기

프로젝트를 진행할 때, 운영체제의 신호를 받아 그에 대응하는 행동을 실행하는 코드를 작성하였다.

빌드한 실행파일을 실행하고, ctrl+ckill 명령을 사용하여 프로그램을 종료할 수 있는데,,

ctrl+z를 눌렀을 때는 stop 이라고 뜨면서,
해당하는 포트로 다른 실행파일을 실행하려면 이미 실행 중인 파일이 있다며 오류가 뜬다..
그리고 내가 중지한 그 프로그램이 재개가 가능하다는 것을 알게 되었다


SIGINT

위 사진은 mqtt 프로젝트의 브로커를 실행하다가, ctrl+c를 눌러 프로그램을 종료한 것이다.

이처럼 foreground에서 동작하는 경우, ctrl+c는 "프로그램 종료"를 의미한다.

  • 종료된 프로세스는 다시 살릴 수 없다.
  • ctrl+c 입력 시, 프로세스에는 SIGINT 라는 신호가 전달된다!

그래서 아래와 같이 채널에 SIGINT 신호가 전달될 시, 서버를 종료하게 만들 수 있다.

sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT)

go func() {
	<-sigs
	server.Close()
	done <- true
}()

SIGTERM

background에서 동작하는 경우, kill 명령은 "프로그램 종료"를 의미한다.

  • 종료된 프로세스는 다시 살릴 수 없다.
  • kill 명령 사용 시, 프로세스에는 SIGTERM 라는 신호가 전달된다!

일반적인 프로세스는 위 두 신호를 수신하면 시스템에 정의된 기본 종료 절차에 의해 종료된다.

  • 특정 신호를 후킹하여 처리하는 핸들러를 등록하기 위해서 C에서는 signal() 함수를 사용한다.
signal.Notify(sigs, syscall.SIGTERM)

SIGSTP

ctrl+z는 "프로세스 정지(stop)"를 의미한다.

  • 정지된 프로세스는 재개할 수 있다.

ctrl+z를 눌러 프로그램을 정지시키면, 위와 같은 화면을 볼 수 있다.

이 프로그램을 재개하려면, 괄호 안에 있는 숫자를 fg % 뒤에 써주면 된다!

  • 위 사진의 프로그램을 재개하려면, 터미널에 fg % 1 입력
  • 주의할 점은, white space를 넣어주어야 한다는 것이다. fg%1이라고 입력하면, 리눅스가 못 알아듣는다고 한다.
  • 참고) fg는 foreground의 축약이다.

그 외


Foreground와 Background

그리고 위에서 foreground와 background 얘기가 많이 나오는데, 얘네는 추후 정리할 예정이다.

간단하게 설명하면,
리눅스에서 Foreground와 Background 프로세스는 터미널과의 연결 여부에 따라 구분된다.

  • 연결된 프로세스를 Foreground Job : 사용자와 상호작용 O
  • 연결되지 않은 프로세스를 Background Job: 사용자와 상호작용 X

Foreground 프로세스는 사용자와 상호작용하며, Background 프로세스는 사용자와 상호작용하지 않는다. 

리눅스 이론 - foreground, background
리눅스 프로세스 작업 전환

profile
공부 기록용 24.08.05~ #LLM #RAG

0개의 댓글