이 예제에서는 신호를 다루는 법을 볼 거예요
여기에는 필요한 헤더 파일이 포함되어 있습니다. 메인 프로그램에서는 PID 시스템 호출을 이용해서
프로세스 id를 보여주는데요.
그런 다음 Sigint라는 신호를 처리해야 한다고 칩시다 신호 Sigint는 Ctrl C를 누르는 거죠
신호 신호 탐지기가 나타나죠
이제 그 함수를 지정하고 있어요 Sigint가 발생할 때마다 호출되어야 하는 거죠
시그트럼이 발생할 때도 마찬가지죠
시그널 처리기라는 기능도 호출할 거예요
신호 처리기는 신호 번호인 정수를 받아들여 보이드를 반환하는 함수예요
신호에 따라 신호 넘버는 특정 신호의 신호 넘버를 취해요
Sigint가 나타난다고 가정해보죠 이 함수는 Sigint와 같은 Sig넘버로
호출되고 시그텀이 나타나면 그 실행은 신호 처리기로 넘어가 시그넘버의 값이 시그텀과 같은
값을 갖게 돼요
이 프로그램은 한동안 계속됩니다 하나는 여기 명시해둔 대로죠
이 프로그램을 컴파일해서 결과를 보죠
이제 프로그램을 컴파일하죠
프로그램을 컴파일하고 프로그램을 실행해보죠
네
프로세스 ID는 31806.이고요
여기서 언급했듯이 시그널 시그 int와 시그널 시그텀을 다루고 있죠
신호 신호 신호 생성하려면 자판에서 컨트롤과 C를 누르세요
자판에서 컨트롤과 C를 누르면 이런 출력이 나오죠
컨트롤을 누르면 프로세스가 실행되고 시그널 Sig int가 뜨죠
신호 처리기를 다뤘기 때문에 이 함수로 점프하죠
이 프린트는 이름이 있어요
Sigint라는 산출물이 나와요
신호정보라는 게 있어요
그리고 탈출 시스템 호출을 통해 프로세스를 벗어나니 프로세스는 끝난 거죠
이제 우리가 출구를 주지 않겠다고 해보죠
이제 이 코드를 주석 처리하고 컴파일하면 결과가 나오죠
이제 프로그램을 실행할 거예요
키보드에서 왜 Ctrl C를 누르는지 볼까요
행동을 보죠
Ctrl C를 누르면 신호 신호 신호가 올라가요
여기서 Sigint라는 선을 프린트하는데 프로그램이 끝나지 않은 게 보이시죠
다음에 Ctrl C를 누르면 다시 같은 동작을 볼 수 있어요
신호가 잡힐 때마다 이 신호 처리기로 점프해 신호 처리기
안에 지정된 동작을 취하죠
한마디로 A예요
신호의 기본 동작을 재정의하지 않는 게 좋아요
신호는 자동으로 프로세스가 종료되니까 신호를 처리하고 적절한
조치를 취한 다음 프로세스를 종료해야 해요
일반적으로 보면 적절한 사용 사례죠
다음 예제를 보죠
어떻게 신호를 무시하는지 보죠
이 경우에 필요한 헤더 파일을 포함하죠
신호 처리기도 만들었어요
그래서 주요 기능부터 실행해야 해요
이 경우엔 Sigint라는 신호가 있을 때마다라고 해보죠
Ctrl C 외에는 아무것도 없어요 신호를 무시해야 해요
그래서 신호를 무시하면 프로세스는 신호가 프로세스에 전달되지 않은 것처럼 행동하죠
이 신호는 무시될 겁니다 신호정보가 왔을 때 어떤 조치도 취하지 마세요
하지만 시그트럼에서는 신호 처리기를 사용하기 때문에 시그트럼 신호가 발생할 때마다
신호 처리기로 넘어가서 이 특정한 엘시프 조건이 실행되죠
이 프로그램을 컴파일해서 결과를 보죠
2번 지구대죠
그러죠
컴파일해요
이제 프로그램을 구성했어요
프로그램을 실행하죠
네
프로세스 ID는 32466.이고요
이제 자판에서 Ctrl+C를 입력할게요
컨트롤 C에 들어간 후에도 프로그램이 다른 곳으로 이동하지 않았어요
신호를 지정해뒀으니까요
이 신호는 무시하세요
Ctrl C에서 나온 Sigint는 무시되고 있어요
이제 신호를 보내면 어떻게 되는지 보죠
시그텀이에요
아까 얘기했던 프레젠테이션으로 돌아가 보면 시그텀은 ID 15의
신호에 불과해요
이제 이 실행 프로세스에 어떻게 시그텀을 주는지 보죠
프로그램이 실행되고 프로세스 ID는 32466.이죠
이제 신호를 보내죠
프로세스ID를 복사할게요
어떤 프로세스든 신호를 보내기 위해서요
그래서 죽이는 걸 사용하죠
죽인 다음에 명령 껍데기가 생기죠
셸 명령어를 사용하여 특정 프로세스에 신호를 보낼 수 있죠
여기요
죽여요
신호 넘버를 한 칸 띄고 프로세스 ID를 적어요
신호를 보내요
이 경우 이걸 실행한 후 신호를 보낼 거예요
32466.번째 절차의 시그텀으로 불리죠
이제 출력을 관찰해보죠
시그텀을 보낸 후에 신호를 보내야 해요
이 과정에서 시그텀이 잡혔죠
신호 처리기를 지정해서 시그트럼만 잡힌 거군요
신호 처리기가 여기로 점프해요
이 발자국은 특히 더 그래요
화면 띄워요
우리는 그 프로그램을 성공적으로 끝내는 경향이 있죠
여기서 일어난 일이에요
여기서 주목할 점은 프로세스 외부에서 특정 신호를 보내기 위한 것이라는 점이에요
명령어 길이란 걸 쓰면 신호 넘버와 연결되는 과정이
나와요
이 경우 처리기 대신 시그터텀을 준다고 해보죠 시그터텀 신호를
무시한다고 해보죠
그래서 신호정보와 신호탐지기 모두 무시당했죠
이걸 컴파일해서 결과를 보죠
이제 프로그램을 실행하죠
이제 프로세스는 ID 32525.가 있죠
프로세스 32525.에 다시 시그텀을 생성하죠
산출물을 살펴보죠
이제 시그트럼을
생성했어요
여길 보면 시그텀은 프로그램에서 안 잡혀요
시그트탐 신호를 무시했기 때문이죠
15번 신호가 시그텀과 일치해요
우리가 신호를 무시했기 때문에 절차도 신호를 무시해요
시그텀이에요
이제 Ctrl C를 입력해보죠 키보드에서 Ctrl C를 입력하고 있어요
컨트롤 C에 들어간 후에도 아무것도 이 신호 때문에요
무시해요
신호가 안 잡혀요
신호가 무시되고 있어요
그렇게 말해두죠
여기서 시프트 0으로 완전한 코드를 코멘트하죠
이제 기본 작업 데모를 보여드리죠
0과 endif라는 해시를 제공함으로써 컴파일러에게 이 코드의 이 부분을 컴파일하지 말라고 하죠
이건 전처리장치 지시예요
0에서 해시 인덱스로요
이 특정 코드는 컴파일되지 않을 거예요
이제 가짜 주 기능을 줄 거예요
루프가 한 번 반복되면 잠시 후에 끝나죠
프로그램을 컴파일하죠
이제 프로그램을 실행하죠
여기 프로세스 ID는 1293.이에요
키보드에서 컨트롤-c를 주면 시그널 처리기를 사용하지 않기
때문에 디폴트 액션을 얻게 돼요
Ctrl C의 기본 동작은 Sigint일 뿐입니다 같은 방법으로 프로그램을 종료하는
거죠
시그텀 바이라는 신호를 생성한다고 해보죠
1312의 프로세스ID를 프로세스ID로 설정할게요
이제 엔터를 누르면 이 프로세스에 시그텀을 주죠
이제 기본 동작을 보죠
절차는 종료됐어요
신호의 기본 동작은 각각의 신호에 따라 달라요
그래서 각각의 신호는 기본 동작이 있어요
다음 예제를 보죠
이 예제에서 기본 액션을 보죠
이 경우엔 신호 처리기가 있고 메인 함수가 시작되죠
시그 DFL을 지정할 때마다 시그니처 Sigint는 특정 신호의 기본 동작이 적용되어야
한다는 뜻이에요
예를 들어 프로그램 전에 신호 처리기를 지정해둔 Sigint가 있었다고 해보죠
이제 Sigint의 기본 동작이 발생하길 원한다고 해보죠
신호 이름과 시그 DFL을 지정하면 신호 처리기를 초기화할 수 있죠
기본값 작업이 실행되죠
이 프로그램을 컴파일해서 이해하도록 하죠
조지아주 애틀랜타요
그래서요?
네
이제 프로그램을 실행하죠
이제 Ctrl c를 눌러요
이제 기본 동작이 발생했어요
신호를 사용할 때마다요 신호 처리기를 다룰 때도요
언제든 특정 신호를 확실히 하고 싶을 때 기본 동작이 되게 하려면
이 sig_df를 지정할 수 있어요
이 경우에는 신호가 바뀌지 않았어요
시그텀을 부를 때마다 신호 처리기로 점프해요
이제 다음 예제를 보죠
지글러라는 신호의 예를 보죠
지글러가 사용되고 신호 처리기도 있어요
이 경우엔 디스플레이 메시지라는 함수를 사용하고 있어요
알람이라고 불리는 함수를 호출할 때마다 가능해요
초 단위로 시간을 지정해야 해요
타이머가 끝나자마자 시그 알람이 울려요
이 경우엔 처리기를 제공하고 있으니 이 함수로 점프하고 이 함수 안에 있는
게 뭐든 실행되죠
이 경우에는 신호 처리기에 경보 신호를 줬고 2초 후에 이 함수로 이동해
이걸 프린트했어요
2초 알람을 설정할 거예요
이제 2초마다 경보 신호가 발생할 거예요
신호 처리기로 계속 전송돼요
이걸 컴파일해서 결과를 보죠
프로그램을 이해하려면요
이제 실행해보죠
2초마다 결과를 관찰하면 신호 처리기로 점프하고 있어요
신호 처리기에서 다시 알람 기능을 부여하죠
코드를 바꾸면 어떻게 되는지 보죠
이제 신호 처리기 내에 어떤 경보도 발생하지 않는다고 해보죠
이제 프로그램의 결과가 어떻게 될지 추측해 보죠
이 경우에는 2초 후에 경보가 울려서 신호가 이쪽으로
이동해요
이게 끝나면 이걸 출력하고 2초 후에는 알람을 출력해요
그 후로요
지금은 경고도 안 했어요
이제 while 안에 있고 하나의 루프예요 while 한 지시를 영원히 실행하죠
이제 예시를 더 보죠
이제 제가 신호를 보낸다고 해보죠
무시해요
이제 신호를 무시하면 어떻게 되는지 보죠
이 경우에는 메인 프로그램이 신호 경보를 위한 신호 처리기를 제공했어요
2초 경보를 울린 후 여기서 점프했어요
여기서 점프하면 이걸 프린트해요
지금은 신호 경보가 무시당하죠
다음부터는 경보 기능이 울리고 신호가 발생하면 그 신호는 무시당해요
시그 알람 때문에 신호 처리기가 울리지 않는다는 뜻이죠
결과를 보죠
2초 후에 시그 단일 원자가 생성됐어요
하지만요
경보 기능은 작동하네요
부르고 있어요
하나의 원자를 생성하고 있어요
하지만 신호를 한 번 무시했으니 이 기능을 호출하죠
신호를 무시하면 신호가 생성되어도 처리기가 호출되지 않아요
이제 디폴트를 활성화하면 이 동작이 어떻게 되는지 보죠
기본값이 나올 때마다 원자 하나가 생성되고 프로그램이 종료돼요
이 경우에는 첫 번째 단일 원자가 되는 거죠
발생하면 신호 처리기로 점프하죠
그건 디스플레이 메시지일 뿐이에요
이게 마지막이에요
신호에 대한 기본 동작을 제공하고 있어요
그 말은 신호의 기본 동작이 프로세스를 종료한다는 거죠
어디 보죠
신호의 기본 동작은 프로세스를 종료하는 거죠
주어진 이후 처음으로 신호 처리기를 지정했어요
여기서 점프해요
그런 다음 신호 처리기를 재설정하고 신호 디폴트를 부여해요
그러면 경보가 울려서 신호가 올 때마다 그것이죠
프로세스를 종료하는 기본 동작이 있어요