2017-03-03 4 views
0

2つのプロセス間でメッセージを送信します。イムは、メッセージキューにメッセージmsgsnd権限エラーなし

を送る

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)); 
} 

メッセージ構造体

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

を作成msgsnd()

でメッセージを送信しようとしたとき、私はEACCESエラーを取得します msgsndのmanページで

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)); } } 

EACCES呼び出し元のプロセスを書かれているメッセージ・キューに読み取り権限がなく、CAP_IPC_OWNERケーパビリティはありません。

ので、私は、アプリケーションが機能を持っている場合、私はgetcapでチェックしましたsetcapコマンド

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

と、以下の機能を追加しました。大丈夫だよ。しかし、私はまだ許可エラーを受け取りません。

root権限でアプリケーションを実行すると、動作します!

非常に奇妙なことですが、msggetは成功しました。ipcsはメッセージキューを表示しません。

だから私のせいですか?

私はLinuxのミント

を使用してい

追加質問:その後、MSG構造体のcharまたはメッセージが文字列に制限されている別のデータ型を使用することが可能であるされていますか?

+1

'msg_queue = msgget(key、IPC_CREAT | 0666)' – Arash

+0

これは 'msgget'が呼び出されたときにEACCESを取得します。ファイル '/ tmp/msg_queue'を削除すると' msgget'と 'msgsnd'が成功しました...ありがとう!しかし、なぜ?! – mvollmer

+0

これは奇妙です..毎回動作します..ファイルを削除して追加した後| 0666をmsggetフラグに設定します。 メッセージキューはipcsで表示されます! ありがとうございました – mvollmer

答えて

0

マニュアルページを読む必要があります。 the POSIX msgget() standardあたり:

SYNOPSIS

#include <sys/msg.h> 

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

説明

...

  • の下位9ビットmsg_perm.modeは、の下位9ビットにmsgflgを設定します。

したがって、このコード

msg_queue = msgget(key, IPC_CREAT); 

はゼロにすべてのセット "MSGFLGの下位9ビット" を有します。したがって、メッセージキューモードもすべて0であり、誰にも許可はありません。

関連する問題