⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shm_s.cpp

📁 在Linux测试共享共享内存消息
💻 CPP
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <time.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/ipc.h>#define SEGSIZE 1024
#define READTIME 1

union semun {
	int val;
	struct semid_ds *buf;
	unsigned short *array;
} arg;

//生成信号量
int sem_creat(key_t key){
	union semun sem;
	int semid;
	sem.val = 0;
	semid = semget(key,1,IPC_CREAT|0666);
	if (-1 == semid){
		printf("create semaphore error\n");
		exit(-1);
	}
	semctl(semid,0,SETVAL,sem);
	return semid;
}

//删除信号量
void del_sem(int semid)
{
	union semun sem;
	sem.val = 0;
	semctl(semid,0,IPC_RMID,sem);
}

//p
int p(int semid)
{	int ret;	struct sembuf sops={0,+1,IPC_NOWAIT};	printf("shm_s-p():before semop(),time=%ld ...\n",time(NULL));	ret=semop(semid,&sops,1);	printf("shm_s-p():after semop(),ret=%d,time=%ld ...\n",ret,time(NULL));	return ret;}//vint v(int semid){	int ret;	struct sembuf sops={0,-1,IPC_NOWAIT};	printf("shm_s-v():before semop(),time=%ld ...\n",time(NULL));	ret=semop(semid,&sops,1);	printf("shm_s-v():after semop(),ret=%d,time=%ld ...\n",ret,time(NULL));	return ret;}
int main()
{
	key_t key;
	int shmid,semid;
	char *shm;
	char msg[7] = "-data-";
	char i;
	struct shmid_ds buf;	printf("======= Run Server Program ===========\n");	key = ftok("./",0);
	shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
	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 = sem_creat(key);
	for (i = 0;i <= 3;i++){
		sleep(1);
		p(semid);		sleep(READTIME);
		msg[5] = '0' + i;
		memcpy(shm,msg,sizeof(msg));
		sleep(58);
		v(semid);	}

	shmdt(shm);
	shmctl(shmid,IPC_RMID,&buf);	del_sem(semid);
	return 0;
}

//编译服务端程序:
	//gcc -o shm_s shm_s.c -g

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -