掲示板ランキング  ジュニアシート  その他  幼児・子供向け  大型遊具  砂あそび・水あそび  おもちゃ箱


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6986

共有メモリをリングバッファに応用できないでしょうか?
投稿者---Sai(2007/01/04 19:41:48)


有メモリを使ったプロセス間通信のプログラムを作成していたのですが、
リングバッファの実装でつまづいてしまいました。共有メモリをリングバッ
ファとして使うにはどうしたらよいのでしょうか?

以下のソースは作成途中のものです。r_mesがメッセージを共有メモリに書き込み、
s_mesが読み込んで表示します。これを書き換えて、典型的なプロデューサ・
コンシューマ型のプログラムにしたいと考えています。

#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/sem.h>

#define MEM_SZ 4096

union semun {
  int val;                  /* SETVAL の値 */
  struct semid_ds *buf;     /* IPC_STAT, IPC_SET 用のバッファ */
  unsigned short *array;    /* GETALL, SETALL 用の配列 */
  /* Linux 特有の部分: */
  struct seminfo *__buf;    /* IPC_INFO 用のバッファ */
};

int set_semaphore(int semaphore)
{
  /* セマフォの作成 */
  semaphore = semget(IPC_PRIVATE, 1, S_IRUSR|S_IWUSR);
  if (semaphore == -1) {
    perror("semget failure");
    exit(EXIT_FAILURE);
  }
  
  /* セマフォの初期化 */
  {
    union semun semunion;
    semunion.val = 1;
    if (semctl(semaphore, 0, SETVAL, semunion) == -1) {
      perror("semctl(init) failure");
      exit(EXIT_FAILURE);
    }
  }
  return semaphore;
}

void sem_lock(int semaphore)
{
  struct sembuf semb;
  semb.sem_num = 0;
  semb.sem_op = -1;
  semb.sem_flg = SEM_UNDO;
  
  if (semop(semaphore, &semb, 1) == -1) {
    perror("lock failure");
    exit(EXIT_FAILURE);
  }
}

void sem_unlock(int semaphore)
{
 struct sembuf semb;
  semb.sem_num = 0;
  semb.sem_op = 1;
  semb.sem_flg = SEM_UNDO;

  if(semop(semaphore, &semb, 1) == -1){
    perror("unlock failure");
    exit(EXIT_FAILURE);
  }
}

void r_mes(int semaphore, char *shm)
{
  while (1) {
    sem_lock(semaphore);    /* ロック */

    scanf("%s", shm);    /* メモりに書きこみ */

    sem_unlock(semaphore);   /* アンロック */
  }
}

void s_mes(int semaphore, char *shm)
{
  while (1) {
    sem_lock(semaphore);    /* ロック */
  
    printf("shared memory is \"%s\"\n", shm);     /* メモりから読み込む */

    sem_unlock(semaphore);    /* アンロック */
  }
}

int main(int argc, char** argv)
{
  char *shm;
  int shmid;
  int semaphore;
  pid_t pid;


  /* 共有メモリ作成 */
  shmid = shmget(IPC_PRIVATE, MEM_SZ, S_IRUSR|S_IWUSR);
  if (shmid == -1) {
    perror("shmget failure\n");
    exit(EXIT_FAILURE);
  }
  /* メモりにアクセスできるようにする*/
  shm = shmat(shmid, (void *)0, 0);
  if (shmid == -1) {
    perror("shmget failure\n");
    exit(EXIT_FAILURE);
  }

  semaphore = set_semaphore(semaphore);

  pid = fork();
  switch (pid){
  case -1:
    perror("fork failure");
    exit(EXIT_FAILURE);
  case 0:
    s_mes(semaphore, shm);
    break;
  default:
    r_mes(semaphore, shm);
    break;
  }

  shmdt(shm);
  shmctl(shmid, IPC_RMID, NULL);

  semctl(semaphore, 0, IPC_RMID, NULL);

  exit(EXIT_SUCCESS);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:共有メモリをリングバッファに応用できないでしょうか? 6991 ありえないざ 2007/01/08 16:00:25


No.6991

Re:共有メモリをリングバッファに応用できないでしょうか?
投稿者---ありえないざ(2007/01/08 16:00:25)


ご質問に対する回答ではありませんが、
過去にLinuxで複数のモジュールからのログを一括管理するログ管理モジュールを
作成した事がありますが、msgsnd() と msgrcv() を利用したメッセージ・キュー
方式を使いました。 もしメッセージの処理を行うのなら、こちらの方法を考えてみてはいかがでしょう?


この投稿にコメントする

削除パスワード

No.6996

Re:共有メモリをリングバッファに応用できないでしょうか?
投稿者---Sai(2007/01/11 09:42:46)


>ご質問に対する回答ではありませんが、
>過去にLinuxで複数のモジュールからのログを一括管理するログ管理モジュールを
>作成した事がありますが、msgsnd() と msgrcv() を利用したメッセージ・キュー
>方式を使いました。 もしメッセージの処理を行うのなら、こちらの方法を考えてみてはいかがでしょう?

アドバイスありがとうございます。
このプログラムではメッセージのみの処理になっていますが、後にマルチプロセスPCルータ
として作り替える予定です。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ