POSIX 메시지 대기열 mq 정보open 프롬프트 오류 정보:Invalid argument 질문

4565 단어 학습 오류 총결

POSIX 메시지 대기열 mq 정보open 프롬프트 오류 정보:Invalid argument 질문


1. 문제점 발견

  • 권2: 프로세스 간 통신의 제5장, p63페이지 코드를 배울 때 mqopen 함수에서 항상 오류 메시지가 표시됩니다. Invalid argument.

  • 항상 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보다 작게 하면 프로그램이 컴파일됩니다.

    좋은 웹페이지 즐겨찾기