两个进程共享一块内存
server
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/shm.h>
#include "shm_com.h"
int main(){
int running = 1;
void *shared_memory = (void *)0;
struct share_use_st *shared_stuff;
int shmid;
srand((unsigned int)getpid());
//创建一个可读可写的共享内存
shmid = shmget((key_t)1234,sizeof(struct share_use_st),0666|IPC_CREAT);
if(shmid == -1){
fprintf(stderr,"shmget faild\n");
exit(EXIT_FAILURE);
}
//启用共享内存
shared_memory = shmat(shmid,(void *)0,0);
if(shared_memory == (void*)-1){
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
//使用共享内存
shared_stuff = (struct share_use_st *)shared_memory;
shared_stuff->written_by_you = 0;
while(running){
if(shared_stuff->written_by_you){
printf("you wrote %s",shared_stuff->some_text);
sleep(rand() % 4);
shared_stuff->written_by_you = 0;
if(strncmp(shared_stuff->some_text,"end",3) == 0){
running = 0;
}
}
}
//共享内存被剥离
if(shmdt(shared_memory) == -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);
}
exit(EXIT_SUCCESS);
}
client
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/shm.h>
#include "shm_com.h"
int main(){
int running = 1;
void *shared_memory = (void *)0;
struct share_use_st *shared_stuff;
int shmid;
char buffer[BUFSIZ];
//创建一个可读可写的共享内存
shmid = shmget((key_t)1234,sizeof(struct share_use_st),0666|IPC_CREAT);
if(shmid == -1){
fprintf(stderr,"shmget faild\n");
exit(EXIT_FAILURE);
}
//启用共享内存
shared_memory = shmat(shmid,(void *)0,0);
if(shared_memory == (void*)-1){
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
//使用共享内存
shared_stuff = (struct share_use_st *)shared_memory;
while(running){
while(shared_stuff->written_by_you){
sleep(1);
printf("waiting for client...\n");
}
printf("Enter some text:");
fgets(buffer,BUFSIZ,stdin);
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->written_by_you = 1;
if(strncmp(buffer,"end",3) == 0){
running=0;
}
}
//共享内存被剥离
if(shmdt(shared_memory) == -1){
fprintf(stderr,"shmdt failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}