現在、POSIXメッセージキューを使用して最小限のIPCを実行しています。私はコマンドとしてuint8_t
のものを渡すだけのパイプと長さが最大128文字の文字列を渡すパイプを持っています。コマンドパイプが正常に動作しています。しかし、stringpipeは常に私にエラー番号90を与えます。これはmessage too long
を意味します。私はこの問題を示す最小限の例を書いています(注意してください:私はそれを最小限に抑えていますので、受信時にエラー以外のエラー処理はありません)。POSIXメッセージキューerrno90が長すぎます
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
int msg_size = 128;
int send()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
strncpy(msg, "this_is_a_test", msg_size);
mq_send(mq, msg, msg_size, 0);
}
int recv()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
int res = mq_receive(mq, msg, msg_size, NULL);
if (res == -1)
{
printf("Errno: %d\n", errno);
}
else
{
printf("Message: %s\n", msg);
}
}
int main()
{
send();
recv();
return 0;
}
コンパイルと:
g++ -o mq mq.c -lrt
なぜC++コードがないときにC++コンパイラでコンパイルするのですか? 'gcc'を使って提案してください。コンパイルするときは、常にすべての警告を有効にしてください。 'gcc' /' g ++ 'を最低限使用してください:' -Wall -Wextra -pedantic'私は '-Wconversion -std = gnu99'も使います。ポストされたコードの場合、コンパイラは多くの警告メッセージを出力します。これらの警告を修正してください。 – user3629249
1)メッセージキューは、そのキューを使用するプロセスの数にかかわらず、1回だけ開く必要があります。 2) 'struct mq_attr'の実際のフィールドリストは実装に依存するので、初期化子を使うことはできません。フィールド名で各フィールドを設定します。' mset(&attr、 '\ 0'、sizeof(attr)) ; attr.mq_maxmsg = 300; attr.mq_msgsize = MSG_SIZE; attr.mq_flags = 0; ' – user3629249