seo网站怎么搭建,忘记wordpress后台密码,十大营销策划公司排名,搭建wordpress站点一、信号灯集
1.1 信号灯集的概念
信号灯集是进程间同步的一种方式。
信号灯集创建后#xff0c;在信号灯集内部会有很多个信号灯。
每个信号灯都可以理解为是一个信号量。
信号灯的编号是从0开始的。
比如A进程监视0号灯#xff0c;B进程监视1号灯。
0号灯有资源在信号灯集内部会有很多个信号灯。
每个信号灯都可以理解为是一个信号量。
信号灯的编号是从0开始的。
比如A进程监视0号灯B进程监视1号灯。
0号灯有资源相应的A进程就可以去执行共享内存的写操作。
1号灯有资源相应的B进程就可以去执行共享内存的读操作。 1.2 信号灯集的API接口分析
#include sys/types.h
#include sys/ipc.h
#include sys/sem.h -- 所需头文件
int semget(key_t key,int nsems,int semflg);
功能获取/创建信号灯集
参数key通过ftok获取的键值nsems信号灯集中信号灯的数量semflgIPC_CREAT|0666 创建信号灯集IPC_CREAT|IPC_EXCL|0666 创建信号灯集信号灯已经存在会返回错误0如果信号灯集已经存在那么直接获取信号灯集
返回值成功返回信号灯集的id失败返回-1置位错误码#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
int semctl(int semid,int semnum,int cmd, ...);
功能控制信号灯集的属性
参数semid:信号灯的标号semnum:第几个灯cmd:IPC_STAT:获取信号灯集的属性 --- 需要使用第四个参数不关注第二个参数IPC_SET:设置信号灯集的属性 --- 需要使用到第四个参数忽略第二个参数IPC_RMID:删除信号灯集 --- 不需要第四个参数忽略第二个参数SETVAL:设置信号灯的数值 --- 需要第四个参数GETVAL:获取信号灯的数值以返回值的形式返回不需要使用第四个参数... ...union semun{int val;struct semid_ds *buf;};
返回值 :GETVAL : 成功返回信号灯的数值其他的cmd 成功返回0失败返回-1置位错误码
ge1设置/获取信号灯集的属性union semun sems;struct semid_ds buf;sems.buf buf;semctl(semid,0,IPC_STAT,sems);//获取buf修改buf中你需要设置的数值semctl(semid,0,IPC_SET,sems);//设置
eg2获取某个信号灯的数值int val semctl(semid,1,GETVAL); //获取1号灯的数值
eg3设置某个信号灯的数值union semun sems;sems.val 1;semctl(semid,1,SETVAL,sems); //将第一个信号灯的数值设置为1
eg4删除信号灯semctl(semif,0,IPC_RMID);#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
int semop(int semid,struct sembuf *sops,size_t nsops);
功能对某些信号灯做操作
参数semid : 信号灯的编号sops : 对信号灯的操作struct sembuf{unsigned short sem_num; //信号灯的编写short sem_op; //对信号灯的操作-1: 申请资源1: 释放资源short sem_flg; //操作模式0: 阻塞IPC_NOWAIT : 非阻塞};
nsops要操作的信号灯的数量如果想要操作多个灯需要定义一个结构体数组将数组首地址传入第二个参数
返回值成功返回0失败返回-1置位错误码
read.c
read.c#include my_head.h
#define SHM_SIZE 4096
union semun{int val;struct semid_ds *buf; };
//设置信号灯集中信号灯的初始值
void sems_init(int semid,int witch,int val){union semun sem {.val val,};semctl(semid,witch,SETVAL,sem);
}
//获取资源V操作
void V(int semid,int witch){struct sembuf buf {.sem_num witch,.sem_op -1,sem_flg 0,};semop(semid,buf,1);
}
//释放资源P操作
void P(int semid,int witch){struct sembuf buf {.sem_num witch,.sem_op 1,.sem_flg 0,};semop(semid,buf,1);
}
int main(int argc,const char *argv[]){//获取键值key_t key ftok(/home/linux,a);if(-1 key){PRINT_ERR(ftok error);}//创建/获取信号灯集int semid semget(key,2,IPC_CREAT|0666);
if(-1 semid)PRINT_ERR(semget error);sems_init(semid,0,1); //第0个灯的初始值为1sems_init(semid,1,0); //第一个灯的初始值为0//获取/创建共享内存int shmid shmget(key,SHM_SIZE,IOC_CREAT|0666);if(-1 shmid)PRINT_ERR(shmget error);//映射共享内存到用户空间以读写的方式映射出来char *rbuf NULL;rbuf shmat(shmid,NULL,0);char buf[128] {0};while(1){V(semid,1); //对1号灯V操作printf(rbuf %s\n,rbuf);P(semid,0);} return 0;
}
write.c
#include my_head.h
#define SHM_SIZE 4096
union semnu{int val;struct semid_ds *buf;};
//设置信号灯集中信号灯的初始值
void sems_init(int semid,int witch,int val){union semun sem {.val val,};semctl(semid,witch,SETVAL,sem);
}
//获取资源V操作
void V(int semid,int witch){struct sembuf buf {.sem_num witch,.sem_op -1,.sem_flg 0,};semop(semid,buf,1);
};
//释放资源P操作
void P(int semid,int witch){struct sembuf buf {.sem_num witch,.sem_op 1,.sem_flg 0,};semop(semid,buf,11);
}int main(int argc,const char *argv[]){//获取键值key_t key ftok(home/linux,a);if(-1 key){PRINT_ERR(ftok error);}//获取/创建共享内存int shmid shmget(key,SHM_SIZE,IPC_CREAT|0666);if(-1 shmid){PRINT_ERR(shmget error);}//创建/获取信号灯集int semid semget(key,2,IPC_CREAT|0666);if(-1 semid){PRINT_ERR(semget error);//映射共享内存到用户空间以读写的方式映射出来char *Wbuf NULL;wbuf shmat(shmid,NULL,0);char buf[128] {0};while(1){V(semid,0);fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] \0;//向共享内存写入内容strcpy(wbuf,buf);p(semid,1);}}
return 0;
}