POSIX 메시지 대기열 mq 정보open 프롬프트 오류 정보:Invalid argument 질문
4565 단어 학습 오류 총결
POSIX 메시지 대기열 mq 정보open 프롬프트 오류 정보:Invalid argument 질문
1. 문제점 발견
항상 mq 에 오류를 포착합니다open 함수의 네 번째 인자 &attr, 패스가 NULL일 때 프로그램은 오류 알림이 없고, &attr일 때 항상 오류 알림을 컴파일합니다.
코드는 다음과 같습니다.
#include "unpipc.h"
struct mq_attr attr;
int main(int argc, char *argv[])
{
mqd_t mqd;
int flags, c;
flags = O_CREAT | O_RDWR;
while( (c = getopt(argc, argv, "em:z:")) != -1) {
switch (c) {
case 'e':
flags |= O_EXCL;
break;
case 'm':
attr.mq_maxmsg = atol(optarg);
break;
case 'z':
attr.mq_msgsize = atol(optarg);
break;
}
}
/*
printf("optind = %d
", optind);
printf("argc = %d
", argc);
printf("maxmsg #msgs = %ld
msgsize #bytes/msg= %ld
curmsg = %ld
", attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);
*/
if(optind != argc-1)
sys_err("usage:mqcreat [-e] [-m maxmsg -z msgsize] " );
if((attr.mq_maxmsg != 0 && attr.mq_msgsize == 0) ||
(attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))
sys_err("must specify both -m maxmsg and -z msgsize");
mqd = mq_open(argv[optind], flags, FILE_MODE, &attr);
if(mqd == -1)
sys_err("mq_open err");
printf("mqd = %d
", mqd);
mq_close(mqd);
return 0;
}
2. 적시에 총결산
manpages의 7장에는 메시지 대기열에 대한 요약이 있습니다.
man mq_overview
/proc interfaces라는 라벨이 있습니다. 몇 가지 제한 문제를 설명합니다.
The following interfaces can be used to limit the amount of kernel memory consumed by POSIX message queues and to set the default attributes for new message queues:
대체로 다음과 같다.
POSIX , 。
그리고
/proc/sys/fs/mqueue/
디렉터리에 있는 파일에 대한 상세한 설명을 드리겠습니다.// :
msg_default 10
msg_max 10
msgsize_default 8192
msgsize_max 8192
queues_max 256
// Ubuntu 16.04 LTS 64
UNP서에 있는 실행 프로그램 매개 변수 maxmsg는 1024로 시스템 제한의 10을 초과했다.따라서 항상 오류 메시지가 표시됩니다. Invalid argument.maxmsg 매개 변수의 크기를 10보다 작게 하면 프로그램이 컴파일됩니다.