IPC (1) 메시지 큐
하나.IPC 개체
IPC 대상 은 프로 세 스 간 통신 의 실체 입 니 다. 생 성 되면 메모리 에 계속 존재 합 니 다. 키 키 키 라 고 하 는 key 를 통 해t 의 수
구조 에 따 르 면 전체 국면 에서 유일한 표지 이다.그러나 IPC 대상 에 대한 접근 은 키 값 이 아니 라 식별 자 를 통 해 이 루어 진다.다른 키
값 은 서로 다른 IPC 식별 자 를 만 들 고, 서로 다른 프로 세 스 는 같은 키 로 IPC 대상 을 열 때 발생 하 는 IPC 식별 자 는 같 습 니 다.
키 값 의 생 성에 대해 ftok 함 수 를 사용 할 수 있 습 니 다. 원형 은 다음 과 같 습 니 다.
key_t ftok(const char* filename,int proj_id) //include
filename: 파일 을 지정 합 니 다. 이 파일 은 존재 하고 가 져 올 수 있어 야 합 니 다.
proj_id: 계획 번호
성공 반환 keyt 키, 실패 반환 - 1 //자세 한 설명 은 온라인 매 뉴 얼 참조.
같은 파일 과 같은 proj 사용 하기id 생 성 키 값 은 같 습 니 다. 즉, filename + proj 입 니 다.id---->key_t 는 한 쌍 이다.
하나의 함수.
다음 단계, IPC 키 를 사용 하여 IPC 대상 을 열 고 IPC 식별 자 를 되 돌려 줍 니 다. semet, shmget, msgget 세 개 를 사용 할 수 있 습 니 다.
함수상세 한 설명 은 다음 글 을 보십시오.
시스템 은 모든 IPC 대상 에 ipc 를 저장 합 니 다.perm 구조 체, 이 구 조 는 IPC 대상 의 권한 과 소유 자 를 설명 하고 확인 합 니 다.
IPC 작업 이 IPC 대상 에 접근 할 수 있 는 지 여 부 를 정 했 습 니 다.
struct ipc_perm{
key_t key; // IPC
uid_t uid; // IPC ID
gid_t gid; // IPC ID
uid_t cuid; // IPC ID
gid_t cgid; // IPC ID
mode_t mode; // IPC
ulong_t seq; //IPC
};
XXXget 함수 로 IPC 대상 을 만 들 때 ipc 초기 화perm 구조 체, 데이터 구성원 을 할당 합 니 다.그 중 모드매개 변 수 는 XXXget 함수 의 flag 매개 변수 설정 모드 에 따라 존재 하 는 IPC 대상 에 접근 하면 flag 를 0 으로 설정 하면 됩 니 다.
둘.메시지 큐 (include < sys / msg. h >)
메시지 대기 열 은 커 널 주소 공간 에서 하나의 링크 로 묘사 되 고 모든 메시지 대기 열 에는 유일한 메시지 대기 열 표지 번호 가 있 습 니 다.
시스템 은 모든 메시지 큐 에 msgque 링크 를 유지 합 니 다. 링크 의 모든 노드 는 msqid 를 가리 키 고 있 습 니 다.ds 구조의 지침,
이 구 조 는 메시지 대기 열 을 완전 하 게 묘사 했다.
time_t msg_stime; };
메시지 큐 의 관련 함수:
int msgget(key_t key,int flag);
기능: 메시지 큐 식별 자 를 만 들 거나 가 져 옵 니 다.
struct msqid_ds{
struct ipc_perm msg_perm;
struct msg* msg_first;
struct msg* msg_last;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
ushort msg_cbytes;
ushort msg_qnum;
ushort msg_qbytes;
ushort msg_lspid;
ushort msg_lrpid;
};
key: IPC 로 지정 되면PRIVATE 즉 0 시 시스템 설정 키 로 새 메시지 큐 를 만 듭 니 다.key 가 0 보다 크 면 매개 변수 flag 를 보고 조작 을 확인 합 니 다.
flag:IPC_CREAT: 이 대기 열 이 커 널 에 존재 하지 않 으 면 만 듭 니 다.
IPC_EXCL: IPCCREAT 와 함께 사용 할 때 이 대기 열 이 존재 하면 생 성 에 실 패 했 습 니 다.
반환: IPC 대상 식별 자 를 성공 적 으로 되 돌려 주 었 습 니 다. 실패 반환 - 1
하면, 만약, 만약...CREAT 는 단독으로 사용 합 니 다. semget () 은 새로 만 든 메시지 대기 열 에 표지 번 호 를 되 돌려 주거 나 같은 것 을 되 돌려 줍 니 다.
키 값 이 존재 하 는 대기 열의 표지 번호 입 니 다.하면, 만약, 만약...EXCL 과 IPCCREAT 와 함께 사용 하거나 새 대기 열 을 만 들 거나,
존재 하 는 대기 열 을 되 돌려 주 거나 - 1.IPC_EXCL 단독 은 소 용이 없습니다. IPCCREAT 를 결합 해서 사용 할 때,
새로 생 성 된 대기 열의 열기 와 접근 을 보장 합 니 다.
또한 flag 는 모드 표지 파라미터 로 사용 할 때 액세스 권한 과 비트 또는 (|) 연산 이 필요 합 니 다.
인 스 턴 스 코드 는 다음 과 같 습 니 다.
int id=msgget(IPC_PRIVATE,IPC_CREAT|0600);
int msgctl(int msgqid,int cmd,struct msqid_ds* buff)
기능: 메시지 큐 대상 에 대한 제어 에 사용 합 니 다.
msqid: 조작 할 메시지 큐 식별 자
cmd: 실행 할 작업 은 다음 을 포함 합 니 다.
IPC_STAT: msqid 메시지 큐 헤드 데 이 터 를 buff 에 가 져 옵 니 다.
IPC_SET: 메시지 큐 의 속성 을 설정 합 니 다. 설정 할 속성 은 buff 에 저 장 됩 니 다. 설정 가능 한 속성 은 다음 과 같 습 니 다.
msg_perm.uid,msg_perm.gid,msg_perm. mode 및 msgqbytes
반환: 0 성공 반환, 실패 반환 - 1
인 스 턴 스 코드:
msqid_id buff;
msgctl(id,IPC_STAT,&buff);
int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg)
기능: msgp 메 시 지 를 식별 자 msqid 메시지 큐 에 기록 합 니 다.
msqid: 조작 할 메시지 큐 식별 자
msgp: 대기 열 에 보 내 는 메 시 지 는 모든 종류의 구조 일 수 있 지만 첫 번 째 필드 는 log 형식 으로 표시 해 야 합 니 다.
메 시 지 를 보 내 는 형식 입 니 다. msgrcv 는 이에 따라 메 시 지 를 받 습 니 다.msgp 참조 형식 은 다음 과 같 습 니 다.
struct msg{
long type; //0 이상, 메시지 유형
}msgp;
msgsz: 메시지 본문 크기, 메시지 형식 을 포함 하지 않 는 4 바이트, 즉 sizeof (msg) - sizeof (long)
msgflg: 실행 에 대한 자세 한 동작 을 설정 합 니 다. 값 은 다음 과 같 습 니 다.
IPC NOWAIT: 메시지 대기 열 이 가득 찼 을 때 함수 가 기다 리 지 않 고 바로 돌아 갑 니 다.
IPC NOERROR: size 바이트 보다 메 시 지 를 보 내 면 메 시 지 를 차단 합 니 다.
반환: 0 성공 반환, 실패 반환 - 1
ssize_t msgrcv(int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg)
기능: 식별 자가 msqid 인 메시지 대기 열 에서 메 시 지 를 읽 고 msgp 에 병존 합 니 다. 읽 은 메 시 지 는 대기 열 에서 삭 제 됩 니 다.
msqid: 조작 할 메시지 큐 식별 자
msgp: 메 시 지 를 저장 하 는 구조 체, 구조 체 유형 은 msgsnd 가 보 내 는 유형 과 같 아야 합 니 다.
msgsz: 메시지 의 크기 를 받 아들 일 것 입 니 다. 메시지 형식 이 차지 하 는 4 바이트 가 포함 되 지 않 습 니 다.
msgtyp: = 0: 첫 번 째 메 시 지 를 받 습 니 다.
>0: msgtyp 과 같은 첫 번 째 메 시 지 를 받 습 니 다.
<0: msgtyp 의 절대 값 보다 작 거나 같은 첫 번 째 메 시 지 를 받 습 니 다.
msgflg: 0: 차단 할 때 메 시 지 를 받 고 유형 에 맞 는 메시지 가 없 으 면 계속 차단 하고 기 다 립 니 다.
IPC NOWAIT: 바람 직 한 메시지 가 없 을 때 함수 가 ENOMSG 오류 메 시 지 를 되 돌려 줍 니 다.
IPC EXCEPT: msgtyp 과 함께 사용 하여 대기 열의 첫 번 째 유형 부위 msgtyp 의 메 시 지 를 되 돌려 줍 니 다.
IPC NOERROR: 메시지 차단
인 스 턴 스 코드 는 다음 과 같 습 니 다.
typedef struct msg{
long type;
char text[10];
}MSG;
int sendmsg(const char* filename,int proj_id)
{
key_t key=ftok(filename,proj_id);
int id=msgget(key,IPC_CREAT|0600);
MSG buf;
buf.type=1;
strcpy(buf.text,"hello");
int sendlength=sizeof(MSG)-sizeof(long);
msgsnd(id,&buf,sendlength,0);
}
int recvmsg(const char* filename,int proj_id)
{
key_t key=ftok(filename,proj_id);
int id=msgget(key,IPC_CREAT|0600);
MSG buf;
int recvlength=sizeof(MSG)-sizeof(long);
msgrcv(id,&buf,recvlength,1,0);
printf("%s
",buf.text);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka 의 0.8.2.1 버 전의 자바 코드 구현1. 설명 이 코드 구현 은 kafka2.10 의 0.8.2.1 버 전의 자바 코드 가 실현 되 고 소비 자 는 여러 개의 Topic 소비 에 대한 다 중 스 레 드 실현 이다. 2. 설치 참고: Kafka 간단 한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.