मैं पुस्तक नमूना कोड के उदाहरणों से संदेश कतार सीख रहा हूँ: https://github.com/bradfa/tlpi-dist/ ब्लॉब/मास्टर/pmsg/pmsg_create.c

हालांकि, कोड संकलित करने और इसे चलाने के बाद

./pmsg_create -c aaa

मैंने पाया

ERROR [EINVAL Invalid argument] mq_open

इसे सूडो के साथ चलाने से भी समस्या हल नहीं होती है। मैंने विभिन्न मापदंडों के साथ कमांड लाइन से maxmsg और msgsize पैरामीटर निर्दिष्ट करने का प्रयास किया है, फिर भी वही त्रुटि है।

मैंने अतीत में प्रश्नों के लिए स्टैक ओवरफ्लो में चारों ओर देखा, लेकिन उनमें से कोई भी मेरी समस्या का समाधान नहीं कर रहा है। मैं इसे उबंटू 20.04 पर चला रहा हूं। नीचे कोड पोस्ट किया।

क्या कोई मुझे त्रुटि और समाधान का कारण बता सकता है?

#include <mqueue.h>                                                                                                                              
#include <sys/stat.h>                                                                                                                            
#include <fcntl.h>                                                                                                                               
#include "tlpi_hdr.h"                                                                                                                            
                                                                                                                                                 
static void                                                                                                                                      
usageError(const char *progName)                                                                                                                 
{                                                                                                                                                
    fprintf(stderr, "Usage: %s [-cx] [-m maxmsg] [-s msgsize] mq-name "                                                                          
            "[octal-perms]\n", progName);                                                                                                        
    fprintf(stderr, "    -c          Create queue (O_CREAT)\n");                                                                                 
    fprintf(stderr, "    -m maxmsg   Set maximum # of messages\n");                                                                              
    fprintf(stderr, "    -s msgsize  Set maximum message size\n");                                                                               
    fprintf(stderr, "    -x          Create exclusively (O_EXCL)\n");                                                                            
    exit(EXIT_FAILURE);                                                                                                                          
}                                                                                                                                                
                                                                                                                                                 
int                                                                                                                                              
main(int argc, char *argv[])                                                                                                                     
{                                                                                                                                                
    int flags, opt;                                                                                                                              
    mode_t perms;                                                                                                                                
    mqd_t mqd;                                                                                                                                   
    struct mq_attr attr, *attrp;                                                                                                                 
                                                                                                                                                 
    /* If 'attrp' is NULL, mq_open() uses default attributes. If an                                                                              
       option specifying a message queue attribute is supplied on the                                                                            
       command line, we save the attribute in 'attr' and set 'attrp'                                                                             
       pointing to 'attr'. We assign some (arbitrary) default values                                                                             
       to the fields of 'attr' in case the user specifies the value                                                                              
       for one of the queue attributes, but not the other. */                                                                                    
                      
    attrp = NULL;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 2048;
    flags = O_RDWR;

    /* Parse command-line options */

    while ((opt = getopt(argc, argv, "cm:s:x")) != -1) {
        switch (opt) {
        case 'c':
            flags |= O_CREAT;
            break;

        case 'm':
            attr.mq_maxmsg = atoi(optarg);
            attrp = &attr;
            break;

        case 's':
            attr.mq_msgsize = atoi(optarg);
            attrp = &attr;
            break;

        case 'x':
            flags |= O_EXCL;
            break;

        default:
            usageError(argv[0]);
        }
    }

    if (optind >= argc)
        usageError(argv[0]);

    perms = (argc <= optind + 1) ? (S_IRUSR | S_IWUSR) :
                getInt(argv[optind + 1], GN_BASE_8, "octal-perms");

    printf("optind = %d, argv[%d] = %s, flags = %x, perms = %o\n", optind, optind, argv[optind], flags, perms);
    mqd = mq_open(argv[optind], flags, perms, attrp);
    if (mqd == (mqd_t) -1)
        errExit("mq_open");

    exit(EXIT_SUCCESS);
}
0
drdot 12 मई 2021, 08:44

1 उत्तर

सबसे बढ़िया उत्तर

अगर आप mq_open के लिए मैनपेज पढ़ते हैं (यहां एक है ऑनलाइन कॉपी), यह कहता है:

EINVAL नाम mq_overview(7) में प्रारूप का पालन नहीं करता है।

Mq_format(7) कहता है कि नाम एक स्लैश (/) से शुरू होना चाहिए, जो aaa नहीं करता है।

1
James R. 12 मई 2021, 08:57