linux下C言語プログラミング7-信号量と共有メモリ


共有メモリを使用する場合は、コンカレントという問題に直面する必要があります.信号量は共有資源の申請と解放を制御することができ,ロックの目的を果たし,同時発生による様々な問題を効果的に解決した.
共有メモリの使用は「linux下C言語プログラミング4-共有メモリを使用してプロセス間通信を実現する2」を参照してください.
信号量の関数は「linux下C言語プログラミング6-信号量関数semget()semop()semctl()」を参照してください.
次に例を示します.
サービス:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <sys/sem.h>
#include <sys/ipc.h>
#define SEGSIZE 1024


//      
int sem_create(key_t key)
{
	int semid;

	semid = semget(key, 250, IPC_CREAT|0666);
	if (semid == -1)
	{
		printf("create semaphore error/n");
		exit(0);
	}
	semctl(semid,0,SETVAL);
	return semid;
}
//     
void del_sem(int semid)
{
	semctl(semid,0,IPC_RMID);
}
//p
int p(int semid) {
/*
sembuf 2   sem_op:
       ,              。              ;
  sem_op     ,             ,      ,          sem_op    。            ;
  sem_op   0,        ,        0。
*/
  struct sembuf sops = {1,-1,SEM_UNDO};	// sops     1
  return semop(semid,&sops,1);
}
//v
int v(int semid) {
  struct sembuf sops = {1,+1,SEM_UNDO};
return semop(semid,&sops,1);
}
int main()
{
	key_t key;
	int shmid,semid;
	char *shm;
	char msg[32] = "xiaoshe-";
	char i;
	struct semid_ds buf;
	key = ftok("/",0);
	
	shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
	if (-1 == shmid){
		printf(" create shared memory error/n");
		return -1;
	}
	printf("shmid = %d/n", shmid);
	
	shm = (char *)shmat(shmid, 0, 0);
	if (-1 == (int)shm){
		printf(" attach shared memory error/n");
		return -1;
	}
	
	semid = sem_create(key);
	printf("semid = %d/n", semid);
	for (i=0; i<3; i++)
	{
		sleep(2);
		p(semid);
		printf("[%d] p ", i);fflush(stdout);
		
		sleep(1);
		//       
		
		msg[8] = '0' + i;
		memcpy(shm, msg, 32);
		printf("-> wirte ");fflush(stdout);
		
		sleep(3);
		v(semid);
		printf("-> v/n");
	}
	shmdt(shm);
	shmctl(shmid,IPC_RMID,&buf);
	del_sem(semid);
	
	return 0;
//gcc -o s s.c -g
}


クライアント:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <time.h>
#include <sys/ipc.h>
#define SEGSIZE 1024



//     
int get_sem(key_t key)
{
	int semid;
	semid = semget(key,20,0);
	if (-1 == semid){
		printf("create semaphore error/n");
		exit(1);
	}
	return semid;
}
//       0
void wait_v(int semid)
{
	struct sembuf sops={1,0,0};
	semop(semid,&sops,1);
}
int main(void)
{
	key_t key;
	int shmid, semid;
	char *shm;
	char msg[100];
	char i;
	key = ftok("/",0);
	shmid = shmget(key,SEGSIZE,0);
	if(-1 == shmid)
	{
		printf(" create shared memory error/n");
		return -1;
	}
	
	shm = (char *)shmat(shmid,0,0);
	if (-1 == (int)shm){
		printf(" attach shared memory error/n");
		return -1;
	}
	
	semid = get_sem(key);
	printf("semid = %d/n", semid);
	for (i=0; i<4; i++)
	{
		sleep(1);
		wait_v(semid);
		printf("[%d] msg = '%s'/n", i, shm);
	}
	shmdt(shm);
	return 0;
// gcc -o c c.c 





}