Linux 신호 (2)
지난 글 에서 우 리 는 Liux 신호 체제 에 관 한 원리 와 데이터 구조, 그리고 두 개의 신호 등록 함 수 를 소개 했다.
이 글 에서 우 리 는 먼저 신호 집합 에 관 한 개념 을 소개 하고 이어서 신호 집합 을 조작 하 는 함 수 를 소개 할 것 이다.
계속 읽 기 전에, 나 는 많은 독자 들 이 우리 가 힘 들 게 배 운 이 물건 들 이 우 리 를 도와 어떤 문 제 를 처리 할 수 있 는 지 궁금 해 할 것 이 라 고 생각한다.
여기 서 우 리 는 먼저 다음 상황 을 토론 한다.
가령, 부모 프로 세 스 가 하위 프로 세 스 를 만 들 고 일정 시간 동안 실행 한 후에 두 프로 세 스 가 협동 하여 작업 을 완성 해 야 한다 고 가정 합 니 다.
하위 프로 세 스 가 어떤 작업 을 완성 한 후에 야 계속 실 행 됩 니 다. 이것 은 전형 적 인 프로 세 스 동기 화 모델 입 니 다.이 공 을 실현 할 수 있 는 많은 메커니즘 이 있다.
에너지, 신 호 량, 조건 변수, 파이프 등등.여기 서 우 리 는 어떻게 신호 로 이 모델 을 실현 할 것 인 가 를 토론 한다.
우선 부모 프로 세 스 가 일부 작업 을 완 료 했 습 니 다. 신호 처리 함수 (등록 하지 않 아 도 됩 니 다) 를 등록 하고 신호 차단 자 를 설정 하 는 목적 은?
지정 한 신 호 를 받 아야 프로그램 을 깨 우 고 pause () 로 끊 습 니 다.하위 프로 세 스 작업 완료, kill 편지 사용
부모 프로 세 스에 계속 실행 할 수 있 도록 신 호 를 보 냅 니 다.
위 에서 신호 차단 자 를 설정 하 는 개념 을 언급 했다.사실 설정 한 것 은 지난 글 에서 프로 세 스 제어 블록 을 언급 한 것 입 니 다.
구조 중의 long block 은 다른 신 호 를 차단 하고 지정 한 신호 만 받 으 며 프로그램 이 차단 을 지연 시 키 는 것 이 목적 입 니 다.
이 차단 이 해 제 될 때 까지 신호 가 받 아들 여 졌 다.이것 은 몇 가지 함수 가 필요 합 니까?
#include <signal.h>
int sigemptyset(sigset_t* set);// set ,
int sigfillset(sigset_t* set); // set ,
int sigaddset(sigset_t* set,int signo); //
int sigdelset(sigset_t* set,int signo); //
그 중 sigsett 이 데이터 구조의 정 의 는 대부분의 Liux 시스템 에서 int 또는 unsigned int 형식 으로 사 용 됩 니 다.
typedef int sigset_t;문 구 를 정의 하 다.여러 신호 의 집합 을 나타 내 는 데 쓰 인 다.
상기 함 수 를 사용 하여 sigsett 신호 집합 을 설정 하고 마지막 으로 sigprocmask 함 수 를 사용 하여 차단 문자 설정, 편지
수 원형 은 다음 과 같다.
#include
int sigprocmask(int how,const sigset_t* set,sigset* oset);
how 매개 변 수 는 이 함수 가 어떤 동작 을 수행 할 지 지정 합 니 다:
SIG_BLOCK: set 가 가리 키 는 신호 집합 을 신호 차단 자 에 추가 합 니 다.
SIG_UNBLOCK: set 가 가리 키 는 신호 집합 을 신호 차단 자 에서 해제 합 니 다.
SIG_SETMASK: 신호 차단 자 를 set 가 가리 키 는 신호 집합 으로 설정 합 니 다.
set 매개 변 수 는 입구 매개 변수 입 니 다.
oset 매개 변 수 는 출구 매개 변수 로 프로 세 스 의 현재 신호 차단 자 를 되 돌려 줍 니 다.
이 럴 때 우 리 는 프로그램의 코드 를 대충 쓸 수 있다.
(즉석에서 쓴 것 으로 테스트 되 지 않 았 으 니 토로 하지 마 세 요)
sigemptyset(&newmask);
이 프로그램 이 성공 한 전 제 는 부모 프로 세 스 의 연결 이 하위 프로 세 스 가 신 호 를 보 내기 전에 발생 하 는 것 입 니 다.그러나 하위 프로 세 스 의 신호 전송 은 여전히
sigprocmask 와 pause 함수 사이 에서 발생 할 수 있 습 니 다. 이 때 부모 프로 세 스 는 이 신 호 를 다시 보지 못 할 수도 있 습 니 다. 부모 프로 세 스 는 영원히
pause 함수 에 차단 합 니 다.따라서 하나의 원자 조작 에서 신호 차단 자, 신호 처리 함수 호출 을 완성 할 필요 가 있다.
신호 차단 자 를 복원 한 다음 프로 세 스 를 연결 합 니 다.이 기능 은 sigsuspend 함수 에서 제공 합 니 다.함수 원형 은 다음 과 같 습 니 다.
#include
int sigsuspend(const sigset_t* mask);
프로 세 스 의 신호 차단 자 를 mask 가 가리 키 는 값 으로 설정 합 니 다.신 호 를 포착 하거나 이 프로 세 스 를 종료 할 수 있 는 신호 가 발생 했 습 니 다.
신호 전에 이 프로 세 스 가 걸 렸 습 니 다.신 호 를 포착 하고 이 신호 처리 프로그램 에서 돌아 오 면 siguspend 가 돌아 갑 니 다.
또한 이 프로 세 스 의 신호 차단 자 를 siguspend 이전 값 으로 설정 합 니 다.
That's all,thank you!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.