スポンサーリンク

UnixのIPCの1つに共有メモリがあります。
共有メモリは、複数のプロセスで、メモリを共有します。
共有メモリを利用するために、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プログラミング

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 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

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー