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?
essayez ceci 'msg_queue = msgget (clé, IPC_CREAT | 0666)' – Arash
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
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