Movatterモバイル変換


[0]ホーム

URL:


BLOGTIMES

cles::blog

平常心是道
« :: »
2018/04/26

POSIX Message Queue を使ってプロセス間通信をする

  c  posix 
このエントリーをはてなブックマークに追加

C 言語から簡単に使える MQ がないかと思って調べてみたら、POSIX Message Queue が恐ろしく便利だったのでメモ。

動作については Java のBlockingQueueをプロセスを跨いで使えるようなイメージです。

サンプルプログラム

今回のプログラムは送信側qsend と受信側qrecv の2つに分かれています。

qsend は 0, 1, 2・・・ というように文字表示しながら、その文字を /testq という Queue に書き込み続けるプログラムになっています。
対になるqrecv は /testq という Queue から文字を取り出して表示を行います。

今回は Queue のサイズを 10 に設定しているので、溜まっているメッセージの数が 10 個になると qsend は mq_send() 部分でブロックし、Queue が空くのを待ちます。qrecv は溜まっているメッセージの数が 0 個になると、mq_receive() 部分でブロックし、新しいメッセージの到着を待ちます。

一見、機能はパイプと大差ない感じに見えるかもしれませんが、このプログラムはどちらから起動しても大丈夫です。
また、qsend, qrecv 共に複数個起動しても問題なく動作します。

qsend.c

#include <mqueue.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#define QNAME "/testq"int main(){int cnt = 0;int ret;char str[100];char *buff;mqd_t q;struct mq_attr attr;attr.mq_flags = 0;attr.mq_maxmsg = 10;attr.mq_msgsize = 1024;attr.mq_curmsgs = 0;mode_t omask;omask = umask(0);q = mq_open(QNAME, (O_WRONLY | O_CREAT), 0777, &attr);umask(omask);if ( q == -1 ){printf("[ERROR]%d: %s\n", errno, strerror(errno));return 1;}while(1){sprintf(str ,"%d", cnt++);buff = (char *)calloc(strlen(str) + 1, sizeof(char));strcpy( buff, str );printf("%s\n", buff);ret = mq_send( q, buff , strlen(buff) , 0);if ( ret == -1) {printf("[ERROR]%d: %s\n", errno, strerror(errno));return 1;}free(buff);sleep(1);}}

qrecv.c

#include <mqueue.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#define QNAME "/testq"int main(){mqd_t q;struct mq_attr attr;char *buff;ssize_t n;int i;q = mq_open(QNAME, O_RDONLY);if ( q == -1 ){printf("[ERROR]%d: %s\n", errno, strerror(errno));return 1;}while(1){mq_getattr( q ,&attr );buff = (char *)malloc(attr.mq_msgsize);n = mq_receive( q, buff, attr.mq_msgsize, NULL);if ( n == -1) {printf("[ERROR]%d: %s\n", errno, strerror(errno));return 1;}for (i = 0; i < n; i++) putchar(buff[i]);putchar('\n');fflush(stdout);free(buff);}}

コンパイルと実行

以下のオプションでコンパイルし、./qsend と ./qrecv を好きなだけ起動すれば動作がわかります。

gcc qrecv.c -lrt -o qrecvgcc qsend.c -lrt -o qsend

参考


    byhsur at 22:22[5年前][4年前][3年前][2年前][1年前][1年後][2年後][3年後][4年後][5年後] |
    こんな記事もあります 「キュー Message Queue
    MariaDB が yum/dnf でアップデートできなくなっていたので
    やはりちょっと地味なブルーインパルス ( 2023 小牧基地オープンベース )
    Zoom も従業員の 15%、1300 人を削減へ
    2022 年の人気エントリ Top 100
    シャープの空気清浄加湿器のキュルキュル音は PTFE スプレーで
    文句なしのブルーインパルス(芦屋航空祭 2022)
    ホワイトキューオンで窓からの音を軽減
    横長の 2 次元バーコード rMQR コードが登場
    NHK プラスは 5/23 から Firefox での視聴が不可に
    IE 終了まであと 3 ヶ月
    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/10135
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL:Yahoo! JAPAN IDでログイン

    « :: »
    Copyright © 2004-2023 by CLES All Rights Reserved.
    サイト内検索
    検索ワードランキング
    へぇが多いエントリ
    閲覧数が多いエントリ
    1 .アーロンチェアのポスチャーフィットを修理(99727)
    2 .年次の人間ドックへ(99121)
    3 .福岡銀がデマの投稿者への刑事告訴を検討中(99120)
    4 .三菱鉛筆がラミーを買収(98726)
    5 .2023 年分の確定申告完了!(1つめ)(98694)
    最新のエントリ
    cles::blogについて
    誰が書いてる?
    最近行った場所
    サイトポリシー
    タグ一覧
    検索ワードランキング

    Referrers

      Powered by CLES
      Nucleus CMS v3.31SP3/w memcached
      21376889(W:7514 Y:1720 T:0988)
      cles::blogのはてなブックマーク数
      benchmark


      [8]ページ先頭

      ©2009-2025 Movatter.jp