#include <myhand.h>
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int set_semno_value(int semid,int semno,int semval)
{ union semun us;
us.val=semval;
if(semctl(semid,semno,SETVAL,us)==-1)
{
perror("semid error");
}
return 0;
}
//声明一个创建信号灯集并初始化
int init_sem(int semnum)
{
key_t key;
if((key=ftok("/",'k'))==-1)
{
perror("ftok error");
return -1;
}
int semid;
if((semid=semget(key,semnum,IPC_CREAT|IPC_EXCL|0664))==-1)
{
if(errno==EEXIST)
{
semid=semget(key,semnum,IPC_CREAT|0664);
return semid;
}
else
{
perror("semget error");
}
return -1;
}
for(int i=0;i<semnum;i++)
{
if(i==0)
{
set_semno_value(semid,i,1);
}
else
{
set_semno_value(semid,i,0);
}
}
return semid;
}
//声明一个p操作
int P(int semid , int semno )
{
struct sembuf buf;
buf.sem_num=semno;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("p error");
return -1;
}
return 0;
}
//声明一个v操作函数
int V(int semid ,int semno)
{
struct sembuf buf;
buf.sem_num=semno;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("v error");
return -1;
}
}
//声明一个删除信号灯集函数
int del_sem(int semid)
{
if(semctl(semid,0,IPC_RMID,0)==-1)
{
perror("delete error");
return -1;
}
return 0;
}
#include <myhand.h>
int main(int argc, const char *argv[])
{ int semid=init_sem(2);
key_t key;
if((key=ftok("/",'z'))==-1)
{
perror("ftok error");
return -1;
}
int shmid;
if((shmid =shmget(key,4096,IPC_CREAT|0664))==-1)
{
perror("shmget error");
return -1;
}
char *addr=NULL;
if((addr=shmat(shmid,NULL,0))==(void*)-1)
{
perror("shmat error");
return -1;
}
printf("addr=%p\n",addr);
while(1)
{
printf("please enter: ");
fgets(addr,4096,stdin);
addr[strlen(addr)-1]='\0';
if(shmdt(addr)==-1)
{
perror("shmdt error");
return -1;
}
}
while(1);
return 0;
}
#include <myhand.h>
int main(int argc, const char *argv[])
{
key_t key;
if((key=ftok("/",'z'))==-1)
{
perror("ftok error");
return -1;
}
int shmid;
if((shmid =shmget(key,4096,IPC_CREAT|0664))==-1)
{
perror("shmget error");
return -1;
}
char *addr=NULL;
if((addr=shmat(shmid,NULL,0))==(void*)-1)
{
perror("shmat error");
return -1;
}
printf("addr=%p\n",addr);
printf("共享内存中的数据为: %s\n",addr);
if(shmdt(addr)==-1)
{
perror("shmdt error");
return -1;
}
if(shmctl(shmid,IPC_RMID,NULL)==-1)
{
perror("shmctl error");
return -1;
}
return 0;
}