2017-03-03 4 views
0

Je souhaite envoyer des messages entre deux processus. Mais je reçois un EACCES erreur quand im essayant d'envoyer un message avec msgsnd()msgsnd aucune erreur d'autorisation

Création de la file d'attente de messages

const char* MSG_QUEUE = "/tmp/msg_queue"; 

int file = open(MSG_QUEUE, O_CREAT | O_RDWR | O_APPEND, 0755); 
close(file); 
key_t key = ftok(MSG_QUEUE, 1); 
errno = 0; 
msg_queue = msgget(key, IPC_CREAT); 
if(msg_queue == -1) { 
    M_DEBUG("Error %s\r\n", strerror(errno)); 
} 

un message struct

struct feld_msg_s { 
    long id; 
    char mtext[5]; 
}; 

envoyer un message

struct feld_msg_s a_msg = {1, "Test"}; 
errno = 0; 
int ret = msgsnd(msg_queue, &a_msg, sizeof(a_msg.mtext), 0); 
if(ret == -1) { 
    if(errno == EACCES) { 
     printf("\r\n NO PERMISSION\r\n"); 
    } else { 
     printf("msgsnd ERROR!: %s\r\n", strerror(errno)); 
    } 
} 

dans la page de msgsnd est écrit

EACCES Le processus d'appel n'a pas d'autorisation de lecture sur la file d'attente de messages, et n'a pas la capacité CAP_IPC_OWNER.

donc j'ai ajouté les fonctionnalités suivantes avec la commande setcap

sudo setcap CAP_SETFCAP,CAP_IPC_OWNER+epi /home/mvollmer/build-APP-Desktop_Qt_5_6_1_GCC_64bit-Debug/APP 

J'ai vérifié avec getcap si l'application a les capacités. C'est bien. Mais je reçois toujours l'erreur No Permission.

Lors de l'exécution de l'application avec les droits root, son fonctionnement!

Une chose est très étrange, bien que msgget ait été un succès ipcs ne montre aucune file d'attente de messages.

Alors, où est ma faute?

J'utilise Linux Mint

Question supplémentaire: Est-il possible d'utiliser un autre type de données puis calciner dans la struct msg ou est un message limité aux chaînes?

+1

essayez ceci 'msg_queue = msgget (clé, IPC_CREAT | 0666)' – Arash

+0

avec ceci j'obtiens un EACCES quand 'msgget' est appelé. Quand je supprime le fichier '/ tmp/msg_queue'' msgget' et 'msgsnd' est réussi ... Merci! Mais pourquoi?! – mvollmer

+0

Ceci est étrange .. cela fonctionne maintenant à chaque fois .. Après la suppression du fichier et ajouter | 0666 au drapeau msgget. et la file d'attente de messages est affichée avec ipcs maintenant! Merci beaucoup – mvollmer

Répondre

0

Vous devez lire la page de manuel. Par the POSIX msgget() standard:

SYNOPSIS

#include <sys/msg.h> 

int msgget(key_t key, int msgflg); [Option End] 

DESCRIPTION

...

  • Le 9 bits de poids faible de msg_perm.mode doit être réglé sur les 9 bits de poids faible msgflg.

Ainsi, ce code

msg_queue = msgget(key, IPC_CREAT); 

a toutes "faible 9 bits de msgflg" à zéro. Ainsi, le mode de file d'attente des messages est également 0 - aucune autorisation pour quiconque.