C言語 FreeBSDで共有メモリを使う shmget/shmat/shmdt
スポンサーリンク
UnixのIPCの1つに共有メモリがあります。
共有メモリは、複数のプロセスで、メモリを共有します。
共有メモリを利用するために、UnixのC言語では、shmget/shmat/shmdtの
システムコールを利用します。
共有メモリの読み込みプログラムと共有メモリへの書き込みプログラムの
サンプルを書いてみました。
shm_read.c
shm_write.c
コンパイル方法
サンプルプログラムの動かし方
サンプルプログラムを動かすには、2つのターミナルを用意してください。
共有メモリ読み込みプログラムを起動します。
shmidで表示される数値を書き込みプログラムのパラメータに使用します。
共有メモリにexitが書き込まれるまで、sleepしながら、共有メモリを
表示します。
共有メモリ書き込みプログラムを起動します。
パラメータに共有メモリ読み込みプログラムで表示された、
shmidを第一引数に与えます。
そうすることで、shm_readが作成した共有メモリにアクセスすることが
できます。
exit(と改行)でプログラムは終了します。
exitを入力するまで、プログラムは実行されます。
参考文献
下記の書籍が参考になります。
詳解UNIXプログラミング
共有メモリは、複数のプロセスで、メモリを共有します。
共有メモリを利用するために、UnixのC言語では、shmget/shmat/shmdtの
システムコールを利用します。
共有メモリの読み込みプログラムと共有メモリへの書き込みプログラムの
サンプルを書いてみました。
shm_read.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <err.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sysexits.h>
#define SHM_SIZE 1000
int
shm_reader()
{
int shmid;
char *shmptr;
shmid = shmget (IPC_PRIVATE, SHM_SIZE, IPC_CREAT|0666);
if (shmid == -1)
{
err (EX_OSERR, "can not get shm");
}
shmptr = shmat (shmid, 0, 0);
if (shmptr == (void *) -1)
{
err (EX_OSERR, "can not shmat(%d)", shmid);
}
else
{
(void) printf ("shmid: %d\n", shmid);
(void) printf ("shared memory: 0x%x\n", shmptr);
(void) strcpy (shmptr, "init");
for ( ; ; )
{
printf ("%s\n", shmptr);
if (strcmp (shmptr, "exit") == 0)
{
break;
}
sleep (2);
}
if (shmdt (shmptr) < 0)
{
//err (EX_OSERR, "can not shmdt %x", ptr);
err (EX_OSERR, "can not shmdt");
}
}
if (shmctl (shmid, IPC_RMID, 0) < 0)
{
err (EX_OSERR, "can not shmctl(%d, IPC_RMDIR)", shmid);
}
return (0);
}
int
main (int argc, char *argv[])
{
shm_reader ();
exit (EXIT_SUCCESS);
}
shm_write.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <err.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sysexits.h>
#define SHM_SIZE 1000
int
shm_writer(int shmid)
{
char *shmptr;
shmptr = shmat (shmid, 0, 0);
if (shmptr == (void *) -1)
{
err (EX_OSERR, "can not shmat(%d)", shmid);
}
else
{
(void) printf ("shmid: %d\n", shmid);
(void) printf ("shared memory: 0x%x\n", shmptr);
(void) printf ("Exit command is 'exit'\n");
for ( ; ; )
{
fgets (shmptr, SHM_SIZE, stdin);
shmptr[strlen(shmptr) - 1] = '\0';
if (strcmp (shmptr, "exit") == 0)
{
break;
}
}
if (shmdt (shmptr) < 0)
{
//err (EX_OSERR, "can not shmdt %x", ptr);
err (EX_OSERR, "can not shmdt");
}
}
return (0);
}
int
main (int argc, char *argv[])
{
if (argc != 2)
{
errx (EXIT_FAILURE, "shm_write shmid");
}
shm_writer (atoi(argv[1]));
exit (EXIT_SUCCESS);
}
コンパイル方法
make shm_read shm_write
サンプルプログラムの動かし方
サンプルプログラムを動かすには、2つのターミナルを用意してください。
共有メモリ読み込みプログラムを起動します。
shmidで表示される数値を書き込みプログラムのパラメータに使用します。
共有メモリにexitが書き込まれるまで、sleepしながら、共有メモリを
表示します。
% ./shm_read shmid: 31522834 shared memory: 0x28177000 init
共有メモリ書き込みプログラムを起動します。
パラメータに共有メモリ読み込みプログラムで表示された、
shmidを第一引数に与えます。
そうすることで、shm_readが作成した共有メモリにアクセスすることが
できます。
exit(と改行)でプログラムは終了します。
% ./shm_write 31522834 shmid: 31522834 shared memory: 0x28177000 Exit command is 'exit' hoge foo bar exit %
exitを入力するまで、プログラムは実行されます。
参考文献
下記の書籍が参考になります。
詳解UNIXプログラミング
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12