版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jirryzhang/article/details/82290109
demo1
writer
#include<stdio.h>
#include<unistd.h>
#include<sys/shm.h>
#include<stdlib.h>
#include <time.h>
int main(){
int shm_id;
int *share;
int num;
srand(time(NULL));
shm_id = shmget (1234, sizeof(int), IPC_CREAT);
if(shm_id == -1){
perror("shmget()");
}
share = (int *)shmat(shm_id, NULL, 0);
for(auto i=0;i<INT32_MAX;++i){
num = random() % 1000;
*share = num;
printf("write a random number %d\n", num);
usleep(100000);
}
shmdt(share);
shmctl(shm_id, IPC_RMID, 0);
return 0;
}
reader
#include<stdio.h>
#include<unistd.h>
#include<sys/shm.h>
#include<stdlib.h>
int main(){
int shm_id;
int *share;
shm_id = shmget (1234, sizeof(int), IPC_CREAT);
if(shm_id == -1){
perror("shmget()");
}
share = (int *)shmat(shm_id, NULL, 0);
for(auto i=0;i<INT32_MAX;++i){
usleep(100000);
printf("read the number %d\n", *share);
}
shmdt(share);
shmctl(shm_id, IPC_RMID, 0);
return 0;
}
demo2
writer
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#define TEST_SIZE 2048
typedef struct _BOX
{
int flag;
char szMsg[TEST_SIZE];
}Box;
int main()
{
int shmid = shmget((key_t)1234, sizeof(Box), 0666|IPC_CREAT);
if(shmid == -1){
perror("shmget()");
}
void *shm = shmat(shmid, (void*)0, 0);
Box *pBox = (Box*)shm;
pBox->flag = 0;
int i=0;
//for(auto i=0;i<100;++i)
while(1)
{
while(pBox->flag == 0)
{
//getchar();
snprintf(pBox->szMsg, sizeof(pBox->szMsg), " Hello Alipay: %d ", ++i);
printf("write msg is [%s]\n", pBox->szMsg);
pBox->flag = 1;
}
sleep(1);
}
shmdt(shm);
shmctl(shmid, IPC_RMID, 0);
return 0;
}
reader
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#define TEST_SIZE 2048
typedef struct _BOX
{
int flag;
char szMsg[TEST_SIZE];
}Box;
int main()
{
int shmid = shmget((key_t)1234, sizeof(Box), IPC_CREAT);
if(shmid == -1){
perror("shmget()");
}
void *shm = shmat(shmid, 0, 0);
Box *pBox = (Box*)shm;
//for(auto i=0;i<500;++i)
while(1)
{
if(pBox->flag == 1)
{
printf("msg from writer is [%s]\n", pBox->szMsg);
pBox->flag = 0;
}
sleep(1);
}
shmdt(shm);
shmctl(shmid, IPC_RMID, 0);
return 0;
}
在编译成功之后,在终端运行可能会报段错误,这是因为没有权限操作共享内存。用sudo运行两个程序解决。