Saya mempelajari antrian pesan dari contoh-contoh dari kode sampel buku: https://github.com/bradfa/tlpi-dist/ blob/master/pmsg/pmsg_create.c

Namun, setelah mengkompilasi kode dan menjalankannya dengan

./pmsg_create -c aaa

Saya mendapatkan

ERROR [EINVAL Invalid argument] mq_open

Menjalankannya dengan Sudo juga tidak menyelesaikan masalah. Saya telah mencoba menentukan parameter maxmsg dan msgsize dari baris perintah dengan parameter yang berbeda, masih kesalahan yang sama.

Saya melihat-lihat di stackoverflow untuk pertanyaan di masa lalu, tetapi sepertinya tidak ada yang menyelesaikan masalah saya. Saya menjalankannya di ubuntu 20.04. Posting kode di bawah ini.

Dapatkah seseorang memberi tahu saya alasan kesalahan dan penyelesaiannya?

#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 Mei 2021, 08:44

1 menjawab

Jawaban Terbaik

Jika Anda membaca halaman manual untuk mq_open (inilah salinan online), dikatakan:

Nama EINVAL tidak mengikuti format di mq_overview(7).

Mq_format(7) mengatakan bahwa nama harus dimulai dengan garis miring (/), sedangkan aaa tidak.

1
James R. 12 Mei 2021, 05:57