可以用于非父子关系的进程;在Linux所有的进程间通信方式中只有无名管道限定在父子进程间通信。
1.进程A
/*
int segment_id = shmget (shm_key, int size , shmflag );
//shm_key 无亲源关系的进程通过该key值对应
//size 申请共享内存的大小
//shmflag IPC_CREAT:指定key的内存;IPC_EXCL:不用指定。
pst= shmat(segment_id, NULL, 0);
//segment_id 前部创建的共享内存
//NULL 由Linux系统自动映射地址
//内存读写权限
shmctl(iShm_id,IPC_RMID,0);
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/sem.h>
//信号量
struct sembuf p1 = {0,-1,0}, p2 = {1,-1,0}, v1 = {0,1,0}, v2 = {1,1,0};
//信号量
int main(){
key_t key;
int shmid;
char *p_addr;
/*获得key*/
if((key = ftok("/home/lianxi/shemem/1.c", 1)) < 0){
printf("ftok error:%s\n", strerror(errno));
return -1;
}
/*创建*/
if((shmid = shmget(key,1024,IPC_CREAT|S_IRUSR|S_IWUSR)) == -1){
printf("create share memory error:%s\n",strerror(errno));
exit(1);
}
/*绑定*/
p_addr = (char *)shmat(shmid,NULL,0);
memset(p_addr,0,1024);
//char *input; input = (char *)malloc(1024);
char input[1024]; int test;
//信号量
int semid;
if((semid = semget(key,2,IPC_CREAT|S_IRUSR|S_IWUSR)) < 0)
printf("create sem error:%s\n",strerror(errno));
if(semctl(semid,0,SETVAL,0) < 0)
printf("semctl error:%s\n",strerror(errno));
if(semctl(semid,1,SETVAL,1) < 0)
printf("semctl error:%s\n",strerror(errno));
//信号量
do{
printf("************start test mem share***************\n");
printf("0 is exit!\n");
gets(input);
test = input[0] - '0';
semop(semid,&v1,1);
strncpy(p_addr,input,1024);
semop(semid,&p2,1);
}while(test);
/*释放*/
if(shmctl(shmid,IPC_RMID,0)<0){
printf("共享内存释放出错!!\n");
return(-1);
}
else printf("释放共享内存成功!\n");
if(semctl(semid,IPC_RMID,0) < 0)
printf("semctl error:%s\n",strerror(errno));
}
gcc -o 1 1.c
************start test mem share***************
0 is exit!
adfda
************start test mem share***************
2.进程B
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/sem.h>
//信号量
struct sembuf p1 = {0,-1,0}, p2 = {1,-1,0}, v1 = {0,1,0}, v2 = {1,1,0};
//信号量
int main(){
key_t key;
int shmid;
char *c_addr;
/*获得key*/
if((key = ftok("/home/lianxi/shemem/1.c", 1)) < 0){
printf("ftok error:%s\n", strerror(errno));
return -1;
}
/*创建*/
if((shmid = shmget(key,1024,IPC_CREAT|S_IRUSR|S_IWUSR)) == -1){
printf("create share memory error:%s\n",strerror(errno));
exit(1);
}
/*绑定*/
c_addr = shmat(shmid,NULL,0);
//信号量
int semid;
if((semid = semget(key,2,IPC_CREAT|S_IRUSR|S_IWUSR)) < 0)
printf("create sem error:%s\n",strerror(errno));
if(semctl(semid,0,SETVAL,0) < 0)
printf("semctl error:%s\n",strerror(errno));
if(semctl(semid,1,SETVAL,1) < 0)
printf("semctl error:%s\n",strerror(errno));
//信号量
do{
semop(semid,&p1,1);
printf("Client get %s\n",c_addr);
semop(semid,&v2,1);
}while(1);
/*释放*/
if(shmctl(shmid,IPC_RMID,0)<0){
printf("共享内存释放出错!!\n");
return(-1);
}
else printf("释放共享内存成功!\n");
if(semctl(semid,IPC_RMID,0) < 0)
printf("semctl error:%s\n",strerror(errno));
}
gcc -o 2 2.c
Client get adfda