리눅스 signal 예제

위의 출력에서 키 조합 ctrl+c를 여러 번 시도했지만 프로세스가 종료되지 않을 때마다 알 수 있습니다. 이는 신호가 코드에서 처리되었고 각 줄에 인쇄된 것으로 확인되었기 때문입니다. 1에서 31까지의 숫자로 식별된 각 신호. 신호는 인수를 전달하지 않으며 이름은 대부분 자명합니다. 예를 들어 SIGKILL 또는 신호 번호 9는 누군가가 그것을 죽이려고 하는 프로그램을 알려줍니다. 일반적으로 나는 이러한 신호에 대한 신호 처리기를 변경하지 않도록하는 것이 좋은 조언이 될 것이라고 생각합니다. 이러한 신호에 대한 기본 신호 처리기는 코어 파일을 생성합니다. 나중에 핵심 파일을 사용하여 문제를 분석하고 해결책을 찾을 수 있습니다. 예외 신호 중 하나에 대한 신호 처리기를 덮어쓰면 프로그램이 이 신호와 신호를 발생시킨 예외를 무시하게 됩니다.

이것은 당신이하고 싶지 않은 일입니다. 그래서, 여기에 우리는 새로운 유형의 `sigfunc`를 만들었습니다. 이제이 typedef를 사용하여 신호 처리기의 프로토 타입을 다시 디자인하면 신호()를 사용하여 특정 신호에 대한 기본 신호 처리기를 설정할 수 있습니다. 특정 신호를 무시하려는 시스템을 알릴 수도 있습니다. 신호를 무시하려면 SIG_IGN을 신호 처리기로 지정합니다. 기본 신호 처리기를 복원하려면 SIG_DFL을 신호 처리기로 지정합니다. 다음은 신호 처리 기능의 프로토 타입입니다 : 그것은 UNIX 플랫폼에서 프로그래밍에 대한 C 프로그래머 가이드입니다. 이 책은 심각한 UNIX / 리눅스 프로그래머를위한 필수입니다.

그것은 필수 유닉스 / 리눅스 API의 기술과 기술을 모두 다룹니다. 이 책은 기본 C 프로그래밍 책이 중단되는 곳에서 시작됩니다. 훌륭한 예제 코드. 이 책은 내가 가는 모든 직업에 나와 함께 여행. 시킬의 가치는 9입니다. 이 때문에 죽일 -9 쉘 명령이 매우 효과적이다 – 그것은 프로세스에 SIGKILL 신호를 보냅니다. 신호 이름은 헤더 파일 signal.h를 포함하여 정의됩니다. 신호 저장이 아니기 때문에 신호 처리기 내부의 printf를 사용하여주의할 것입니다. 대신 쓰기를 사용해야 합니다.

나는 이것을 어려운 방법으로 배웠다. 기존의 유닉스 시스템에는 해답이 준비되어 있습니다. 이러한 질문에 대한 대답은 신호입니다. 신호를 사용하는 또 다른 방법은 나쁜 일이 발생했음을 나타내는 것입니다. 예를 들어 프로그램이 세분화 오류를 일으키는 경우 운영 체제는 응용 프로그램에 SIGSEGV 신호를 보냅니다. kill 함수는 지정된 신호인 sig를 pid에 의해 식별자가 지정된 프로세스로 보냅니다. 성공에 0을 반환합니다. 신호를 보내려면 송신 프로세스에 그렇게 할 수 있는 권한이 있어야 합니다. (수퍼유저는 모든 프로세스에 신호를 보낼 수 있습니다. ) 예: 아래 예에서 SIGINT(= 2) 신호가 차단되고 신호가 보류 중입니다. 신호 처리기에서 printf를 사용해서는 안 됩니다. 참조: sIGKILL에 http://man7.org/linux/man-pages/man7/signal.7.html SIGTERM과 반대로 프로그램의 비정상적인 종료를 나타냅니다.

프로그램에서 처리하는 방법을 변경할 수 없습니다. 그것은 항상 프로그램을 종료합니다. 그러나 이 신호를 보낼 수 있습니다. 그들은 모두 같은 타이머를 공유하기 때문에 알람()와 수면()을 혼합하는 것은 나쁜 생각이다 : 하나에 대한 호출은 다른 의 사용을 방해할 것입니다 그래서 우리는 사용자 정의 신호 USR1이 과정에서 수신하고 제대로 처리된 것을 볼 수 있습니다. 프로세스는 사용자의 자체 처리기 함수로 거의 모든 신호(SIGKILL 제외)의 기본 신호 처리기를 대체할 수 있습니다. 신호 처리기 함수는 모든 이름을 가질 수 있지만 반환 형식 void가 있고 하나의 int 매개 변수가 있어야 합니다.