링크 ux 메시지 큐 작업
7536 단어 linux
struct msgbuf{
long mtype;
char mtext[1];
};
mtype 구성원 은 메시지 형식 을 대표 합 니 다. 메시지 대기 열 에서 메 시 지 를 읽 는 중요 한 근 거 는 메시지 의 유형 입 니 다.mtext 는 메시지 내용 입 니 다. 물론 길이 가 꼭 1 은 아 닙 니 다.따라서 메 시 지 를 보 내 는 데 있어 서 먼저 msgbuf 버퍼 를 미리 설정 하고 메시지 형식 과 내용 을 기록 하 며 해당 하 는 전송 함 수 를 호출 하면 됩 니 다.메 시 지 를 읽 는 데 있어 서 먼저 이러한 msgbuf 버퍼 를 할당 한 다음 에 메 시 지 를 이 버퍼 에 읽 으 면 됩 니 다.3. 메시지 큐 속성 을 획득 하거나 설정 합 니 다. 메시지 큐 의 정 보 는 기본적으로 메시지 큐 에 저장 되 어 있 기 때문에 메시지 큐 헤드 와 비슷 한 구조 (struct msqid ds, 참조 부록 2 를 할당 하여 메시지 큐 의 속성 을 되 돌려 줍 니 다.이 데이터 구 조 를 설정 할 수 있 습 니 다.메시지 큐 API 1, 파일 이름 부터 키 까지
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok (char*pathname, char proj);
경로 pathname 에 해당 하 는 키 값 을 되 돌려 줍 니 다.이 함 수 는 메시지 대기 열 에 직접 동작 하지 않 지만, ipc (MSGGET,...) 또는 msgget () 를 호출 하여 메시지 대기 열 묘사 서술 자 를 얻 기 전에 이 함 수 를 호출 합 니 다.전형 적 인 호출 코드 는: key=ftok(path_ptr, 'a');
ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);
…
2. 시스템 V 메시지 큐 API 시스템 V 메시지 큐 API 는 공동으로 네 개 를 가지 고 있 으 며 사용 할 때 몇 개의 헤더 파일 을 포함해 야 합 니 다.#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
1) int msgget (key t key, int msgflg) 매개 변수 key 는 키 값 으로 ftok 에서 얻 을 수 있 습 니 다.msgflg 인 자 는 일부 표지 위치 입 니 다.이 호출 은 건 치 키 와 상응하는 메시지 대기 열 묘사 서술 자 를 되 돌려 줍 니 다.다음 두 가지 상황 에서 이 호출 은 새로운 메시지 대기 열 을 만 들 것 입 니 다.매개 변수 msgflg 는 다음 과 같 습 니 다: IPCCREAT、IPC_EXCL、IPC_NOWAIT 또는 삼자 의 결과.호출 반환: 메시지 대기 열 에 서술 자 를 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 로 돌아 갑 니 다.주: 매개 변수 key 상수 IPC 로 설정PRIVATE 는 다른 프로 세 스 가 이 메시지 큐 에 접근 할 수 없다 는 것 을 의미 하지 않 으 며, 곧 새로운 메시지 큐 를 만 들 것 임 을 의미 합 니 다.2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);이 시스템 은 msgid 가 대표 하 는 메시지 대기 열 에서 메 시 지 를 읽 고 msgp 가 가리 키 는 msgbuf 구조 에 메 시 지 를 저장 합 니 다.msqid 는 메시지 대기 열 에 서술 자 를 묘사 합 니 다.메시지 가 돌아 온 후 msgp 가 가리 키 는 주소 에 저 장 됩 니 다. msgsz 는 msgbuf 의 mtext 구성원 의 길이 (즉 메시지 내용 의 길이) 를 지정 합 니 다. msgtyp 은 읽 기 를 요청 하 는 메시지 형식 입 니 다.메시지 읽 기 표지 msgflg 는 아래 의 몇 개의 상수 값 이나:
msgrcv 매 뉴 얼 에서 메시지 형식 이 다른 값 을 가 져 올 때 (> 0; 0; = 0) 를 구체 적 으로 보 여 주 었 습 니 다. 메시지 대기 열 에 있 는 메 시 지 를 되 돌려 줍 니 다.msgrcv () 차단 해제 조건 은 세 가지 가 있 습 니 다.
호출 반환: 메 시 지 를 읽 은 실제 바이트 수 를 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 로 되 돌려 줍 니 다.3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);msgid 가 대표 하 는 메시지 큐 에 메 시 지 를 보 냅 니 다. 곧 보 낼 메 시 지 는 msgp 가 가리 키 는 msgbuf 구조 에 저 장 됩 니 다. 메시지 의 크기 는 msgze 에서 지정 합 니 다.메 시 지 를 보 내 는 데 의미 있 는 msgflg 표 지 는 IPC 입 니 다.NOWAIT, 메시지 대기 열 에 보 낼 메 시 지 를 수용 할 공간 이 충분 하지 않 을 때 msgsnd 가 기다 릴 지 여부 입 니 다.msgsnd () 대기 조건 은 두 가지 가 있 습 니 다.
msgsnd () 차단 해제 조건 은 세 가지 가 있 습 니 다.
호출 반환: 0 을 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);이 시스템 은 msqid 로 표 시 된 메시지 큐 에서 cmd 작업 을 실행 하고 세 가지 cmd 작업 이 있 습 니 다: IPCSTAT、IPC_SET 、IPC_RMID。
호출 반환: 0 을 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.
----------------------------------------------------------------------------------------------------------------------
/*msgserver.c*/
#include
#define MSG_FILE "msgserver.c" #define BUFFER 255 #define PERM S_IRUSR|S_IWUSR / * 서버 에서 만 든 메시지 큐 가 마지막 에 삭제 되 지 않 았 습 니 다. ipcrm 명령 으로 삭제 할 * / * ipcrm - q < msqid > * /
struct msgtype { long mtype; char buffer[BUFFER+1]; };
int main() { struct msgtype msg; key_t key; int msgid; if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"Creat Key Error:%s/n", strerror(errno)); exit(1); }
if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1) { fprintf(stderr, "Creat Message Error:%s/n", strerror(errno)); exit(1); } printf("msqid = %d/n", msgid); while(1) { msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); fprintf(stderr,"Server Receive:%s/n", msg.buffer); msg.mtype = 2; msgsnd(msgid, &msg, sizeof(struct msgtype), 0); } exit(0); }
/* msgclient.c */
#include
#define MSG_FILE "msgserver.c" #define BUFFER 255 #define PERM S_IRUSR|S_IWUSR
struct msgtype { long mtype; char buffer[BUFFER+1]; };
int main(int argc, char **argv) { struct msgtype msg; key_t key; int msgid; if(argc != 2) { fprintf(stderr,"Usage:%s string/n", argv[0]); exit(1); } if((key=ftok(MSG_FILE,'a'))==-1) { fprintf(stderr,"Creat Key Error:%s/n", strerror(errno)); exit(1); } if((msgid=msgget(key, PERM))==-1) { fprintf(stderr,"Creat Message Error:%s/n", strerror(errno)); exit(1); } msg.mtype = 1; strncpy(msg.buffer, argv[1], BUFFER); msgsnd(msgid, &msg, sizeof(struct msgtype), 0); memset(&msg, '/0', sizeof(struct msgtype)); msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0); fprintf(stderr, "Client receive:%s/n", msg.buffer); exit(0);}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.