write.c
/*共享内存实现进程通信
key=ftok("write.c",0x00); //两个非亲缘进程用同一个key
int shmid = shmget(key, 512, IPC_CREAT|0600);ipc_private(亲缘间代替key)
char *shmaddr;
写端:shmaddr = (char *)shmat(shmid,NULL,0);
//id与内存绑定,然后写shmaddr
shmdt(shmaddr); //关闭后让读端读
读端:shmaddr=(char *)shmat(shmid,NULL,0);
*/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/shm.h>#include<error.h>#include<string.h>#include<sys/types.h>typedefstruct book
{char no[8];char name[8];double price;}book;intmain(void){int shmid;
key_t key;
book *shmaddr;
book allbook [2]={{"001","math",12.5},{"002","math",13.5}};
key=ftok("write.c",0x00);//建shmif(key==-1){perror("key error\n");return-1;}printf("key=%d\n",key);
shmid=shmget(key,512,IPC_CREAT|0600);if(shmid<0){perror("shmid get error\n");return-1;}printf("shmid =%d\n",shmid);//连shm
shmaddr=(book *)shmat(shmid,NULL,0);if(shmaddr<(book *)0){perror("shmat addr error\n");return-1;}memcpy(shmaddr,allbook,sizeof(book)*2);int i;for(i=0;i<2;i++){printf("no:%s,",(*(shmaddr+i)).no);printf("name:%s,",shmaddr[i].name);printf("price:%lf\n",shmaddr[i].price);}shmdt(shmaddr);return0;}
read.c
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/shm.h>#include<error.h>#include<string.h>#include<sys/types.h>typedefstruct book
{char no[8];char name[8];double price;}book;intmain(void){int shmid,i;
key_t key;
book *shmaddr;
key=ftok("write.c",0x00);//建shmif(key==-1){perror("key error\n");return-1;}printf("key=%d\n",key);
shmid=shmget(key,512,IPC_CREAT|0600);if(shmid<0){perror("shmid get error\n");return-1;}printf("shmid =%d\n",shmid);//连shm
shmaddr=(book *)shmat(shmid,NULL,0);if(shmaddr<(book *)0){perror("shmat addr error\n");return-1;}for(i=0;i<2;i++){printf("no:%s,",(*(shmaddr+i)).no);printf("name:%s,",shmaddr[i].name);printf("price:%lf\n",shmaddr[i].price);}shmdt(shmaddr);return0;}
进程间通信----信号量
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/sem.h>#include<errno.h>#include<sys/types.h>#include<sys/ipc.h>int sem_id;voidinit(){
key_t key;int ret;unsignedshort sem_array[2];union semun
{int val;struct semid_ds *buf;unsignedshort*array;}arg;
key=ftok("mysem",'s');
sem_id=semget(key,2,IPC_CREAT|0644);
sem_array[0]=0;
sem_array[1]=100;
arg.array = sem_array;
ret=semctl(sem_id,0,SETALL,arg);if(ret==-1){printf("SETALL failed (%d)\n",errno);}printf("productor init is %d\n",semctl(sem_id,0,GETVAL));//getvalprintf("space init is %d\n\n",semctl(sem_id,1,GETVAL));}voiddel(){semctl(sem_id,0,IPC_RMID);}intmain(int argc,char*argv[]){struct sembuf sops[2];
sops[0].sem_num=0;
sops[0].sem_op=1;
sops[0].sem_flg=0;
sops[1].sem_num=1;
sops[1].sem_op=-1;
sops[1].sem_flg=0;init();printf("以下为生产者\n");while(1){printf("\n输出前:\n");printf("productor number is %d\n",semctl(sem_id,0,GETVAL));printf("space number is %d\n",semctl(sem_id,1,GETVAL));semop(sem_id,(struct sembuf*)&sops[1],1);printf("now producing...\n");semop(sem_id,(struct sembuf*)&sops[0],1);printf("\nafter produce\n");printf("space number is %d\n",semctl(sem_id,1,GETVAL));printf("productor number is %d\n",semctl(sem_id,0,GETVAL));sleep(2);}del();return0;}//sem_customer.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<errno.h>int sem_id;voidinit(){
key_t key;
key=ftok("mysem",'s');
sem_id=semget(key,2,IPC_CREAT|0644);}intmain(int argc,char*argv[]){struct sembuf sops[2];
sops[0].sem_num=0;
sops[0].sem_op=-1;
sops[0].sem_flg=0;
sops[1].sem_num=1;
sops[1].sem_op=1;
sops[1].sem_flg=0;init();printf("this is customer\n");while(1){printf("\n\nbefore consume:\n");int ret=semctl(sem_id,0,GETVAL);int ret1=semctl(sem_id,1,GETVAL);printf("productor is %d\n",ret);printf("space is %d\n",ret1);semop(sem_id,(struct sembuf*)&sops[0],1);printf("now consuming...\n");semop(sem_id,(struct sembuf*)&sops[1],1);printf("\nafter consume\n");printf("productor number is %d\n",semctl(sem_id,0,GETVAL));printf("space number is %d\n",semctl(sem_id,1,GETVAL));sleep(3);}return0;}