Linux编程,进程间通信,共享内存

    此次给大家分享的是Linux下通过共享内存,实现进程间的通信,流程如下:

    创建写进程,其功能为创建共享内存并映射到私有地址空间,然后向内存写入数据,直至遇到’#’为止,读进程使用和写进程相同的KEY创建共享内存并映射到私有地址空间,然后从内存读数据并打印在终端上。

    write.c   

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
{
	int written;
	char text[TEXT_SZ];
};
#endif
int main()
{
	void *shm = NULL;
	struct shared_use_st *shared = NULL;
	char buffer[TEXT_SZ+1];
	int shmid = shmget(ftok(".",'a'), sizeof(struct shared_use_st),0666|IPC_CREAT);
	if(shmid==-1)
	{
		perror("shmget failed");
		exit(1);
	}
	shm = shmat(shmid,(void*)0,0);
	if(shm == (void*)-1)
	{
		perror("shamt failed");
		exit(1);
	}
	shared = (struct shared_use_st*)shm;
	do{
		while(shared->written==1)
		{
			sleep(1);
			printf("Waiting...\n");
		}
		printf("Enter some text:");
		fgets(buffer,TEXT_SZ,stdin);
		strncpy(shared->text,buffer,TEXT_SZ);
		shared->written = 1;		
	}while(strncmp(buffer,"#",1)!=0);
	if(shmdt(shm) == -1)
	{
		perror("shmdt failed\n");
		exit(1);
	}
	exit(0);
}

    read.c

  

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
{
	int written;
	char text[TEXT_SZ];
};
#endif
int main()
{
	void *shm = NULL;
	struct shared_use_st *shared;
	int shmid=shmget(ftok(".",'a'),sizeof(struct shared_use_st),0666|IPC_CREAT);
	if(shmid==-1)
	{
		perror("shmget failed");
		exit(1);
	}
	shm = shmat(shmid,(void*)0,0);
	if(shm == (void*)-1)
	{
		perror("shamt failed");
		exit(1);
	}
	shared = (struct shared_use_st*)shm;
	do
	{
		if(shared->written != 0)
		{
			printf("read:%s",shared->text);
			sleep(rand()%3);
			shared->written = 0;
			if(strncmp(shared->text,"#",1) == 0)
				break;
		}
		else
			sleep(1);
	}while(1);
	if(shmdt(shm) == -1)
	{
		perror("shmdt failed\n");
		exit(1);
	}
	exit(0);
	
}

    在两个终端中分别打开read和write后在write中输入信息,read中显示:

    输入#后 write和read退出:

    创建了一个结构体用于存储读写数据text[]和同步信号量written,创建共享内存时用shmget(ftok(".",'a'),sizeof(struct shared_use_st),0666|IPC_CREAT),ftok(“.”,’a’)起到一个媒介的作用,两个没有关系的内存,通过ftok()输入相同的参数得到相同的共享内存的键值。

猜你喜欢

转载自blog.csdn.net/m0_37872090/article/details/80528877