Linux共有メモリ通信の例

Linux共有メモリ通信の例

共有メモリは動的割り当て機能に似ています。システムの個別の領域が共有メモリに個別に割り当てられ、異なるプロセスがその領域にアクセスできます。

ヘッダーファイル
#include <sys / types.h>
#include <sys / ipc.h>
#include <sys / shm.h>
元の関数
共有メモリの作成
int shmget(key_t key、size_t size、int shmflg);
return success returnメモリID、エラー-1
int shmctl(int shm_id、int cmd、struct shmid_ds * buf);


フック操作void * shmat(int shm_id、const void * shm_addr、int shmflg);
別の操作
int shmdt(const void * shmaddr);

プログラム例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>


typedef struct shared_use_st
{
    
      
    int written;//作为一个标志,非0:表示可读,0表示可写 
    char text[2048];//记录写入和读取的文本
	int len;
}Shm_def;


void shm_write(char *s,int len)
{
    
    
	void *shm = NULL;  
    Shm_def *shared = NULL;
    int shmid;  
	
	//创建共享内存
    shmid = shmget((key_t)1234, sizeof(Shm_def), 0666|IPC_CREAT);
    if(shmid == -1)
    {
    
      
        printf("shmget failed\n");
        exit(EXIT_FAILURE);
    }   
	//将共享内存连接到当前进程的地址空间
    shm = shmat(shmid, (void*)0, 0);   
    if(shm == (void*)-1)
    {
    
      
        printf("shmat failed\n");     
        exit(EXIT_FAILURE);
    }  
    printf("write at %X\n", (int)shm);    //设置共享内存   
    shared = (Shm_def *)shm;   
	
	//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本       
    while(shared->written == 1)     
    {
    
              
         sleep(1);      
         printf("Waiting...\n");
    }       
	strncpy(shared->text, s, len);      //写完数据,设置written使共享内存段可读      
	shared->len = len;
    shared->written = 1;      
	
	//把共享内存从当前进程中分离
    if(shmdt(shm) == -1)   
    {
    
          
        printf("shmdt failed\n");     
        exit(EXIT_FAILURE);
    }  
}


int shm_read(char *s,int len)
{
    
    
	int rtn_len;
	void *shm = NULL;//分配的共享内存的原始首地址   
    Shm_def *shared;//指向shm   
    int shmid;//共享内存标识符 
	
	//创建共享内存   
    shmid = shmget((key_t)1234, sizeof(Shm_def), 0666|IPC_CREAT);
    if(shmid == -1)
    {
    
          
        printf("shmget failed\n");
        exit(EXIT_FAILURE);
    }   
	//将共享内存连接到当前进程的地址空间
	shm = shmat(shmid, 0, 0);
    if(shm == (void*)-1)   
    {
    
      
        printf("shmat failed\n"); 
        exit(EXIT_FAILURE);
    }   
	printf("\nread at %X\n", (int)shm);  //设置共享内存   
    shared = (Shm_def *)shm;   
	while(shared->written == 0)
	{
    
    
		sleep(1);      
       		 printf("Waiting...\n");
	}
    
	strncpy(s, shared->text, shared->len);
   	rtn_len = shared->len;
	shared->written = 0;
  	printf("read:%s\n",shared->text);
	//把共享内存从当前进程中分离
    if(shmdt(shm) == -1)   
    {
    
          
        fprintf(stderr, "shmdt failed\n");     
        exit(EXIT_FAILURE);
    }   
	//删除共享内存   
    if(shmctl(shmid, IPC_RMID, 0) == -1)   
    {
    
      
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");  
        exit(EXIT_FAILURE);
    }  

	return rtn_len;
}

//进程1
void process1(void)
{
    
    
	while(1)
	{
    
    
		printf("\n\n\n\nprocess1:write shm\n"); 
		shm_write("hello guoguo\nshm test\n",22);
		sleep(2);
	}
}

//进程2
void process2(void)
{
    
    
	char buf[100];
	int len;
	
	while(1)
	{
    
    
		printf("process2:read shm\n"); 
		len = shm_read(buf, 100);
		buf[len] = '/0';
		printf("%s",buf);
	}
}

int main(int argc, const char *argv[])
{
    
    
	pid_t pid,pid1;
	
	
//创建2个进程
	pid = fork(); 
	if(pid == 0)
	{
    
    
		printf("process1 create ok\n");  
		process1();
	}
	else if(pid < 0)
		{
    
    
			printf("process create failed\n"); 
			perror("fork");  
		}
		else
		{
    
    

		}
	pid1 = fork(); 
	if(pid1 == 0)
	{
    
    
		printf("process2 create ok\n");  
		process2();
	}
	else if(pid < 0)
		{
    
    
			printf("process2 create failed\n"); 
			perror("fork");  
		}
		else
		{
    
    
			
		}
 
    return 0;
}

おすすめ

転載: blog.csdn.net/u010835747/article/details/105166663