
系统调用:semget()
原型:intsemget(key_t key,int nsems,int semflg)
返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1:errno=EACCESS(没有权限)
EEXIST(信号量集庆租已经存在,无法创建)
EIDRM(信号量集已经删除)
ENOENT(信号量集不存在,同时没有使用IPC_CREAT)
ENOMEM(没有足够的内存创建新的信号量集)
ENOSPC(超出限制)
系统调用semget()的第一个参数是关键字值(一般是由系统调用ftok()返回的)。系统内核将此值和系统中存在的其他的信号量耐胡集的关键字值进行比 较。打开和存取 *** 作与参数semflg中的内容相关。IPC_CREAT如果信号量集在系统内核中不存在,则创建信号量集。IPC_EXCL当和 IPC_CREAT一同使用时,如果信号量集已经存在,则调用失败。如誉亩兆果单独使用IPC_CREAT,则semget()要么返回新创建的信号量集的标识 符,要么返回系统中已经存在的同样的关键字值的信号量的标识符。如果IPC_EXCL和IPC_CREAT一同使用,则要么返回新创建的信号量集的标识 符,要么返回-1。IPC_EXCL单独使用没有意义。参数nsems指出了一个新的信号量集中应该创建的信号量的个数。信号量集中最多的信号量的个数是 在linux/sem.h中定义的:
/***Msginput.c***/升毕#include<sys/穗笑吵types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include"Mysem.h"
int main(){
FILE *fp
int empty
int full
int mutex
char * shm
int shmid
fp = fopen("shmid","r")
fread(&shmid,sizeof(int), 1, fp)
fread(&empty,sizeof(int), 1, fp)
fread(&full,sizeof(int), 1, fp)
fread(&mutex,sizeof(int), 1, fp)
fclose(fp)
shm = shmat(shmid, NULL, 0)
while(1){
P(&empty)
P(&mutex)
scanf("%s", shm)
if(strcmp(shm, "END"猜侍) == 0){
V(&mutex)
V(&full)
break
}
V(&mutex)
V(&full)
}
return 0
}
/****Mysem.c*****/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include "Mysem.h"
#define BUFFER_SIZE 512
int main(){
char *shm
int empty
int full
int mutex
int shmid
int pid
int i
FILE *fp
// int init_sem_value = 0
empty = semget(IPC_PRIVATE, 1, (0600|IPC_CREAT))
if(empty == -1){
perror("semget")
exit(1)
}
if(semctl(empty, 0, SETVAL, 1)<0){
perror("semctl")
exit(1)
}
full = semget(IPC_PRIVATE, 1, (0600|IPC_CREAT))
if(full == -1){
perror("semget")
exit(1)
}
if(semctl(full, 0, SETVAL, 0)<0){
perror("semctl")
exit(1)
}
mutex = semget(IPC_PRIVATE, 1, (0600|IPC_CREAT))
if(mutex == -1){
perror("semget")
exit(1)
}
if(semctl(mutex, 0, SETVAL, 1)<0){
perror("semctl")
exit(1)
}
shmid = shmget(IPC_PRIVATE, (BUFFER_SIZE*sizeof(char)),(IPC_CREAT|0600))
if(shmid == -1){
perror("shmget")
exit(1)
}
shm = shmat(shmid, NULL, 0)
if(shm == (char*)-1){
perror("shmat")
exit(1)
}
fp = fopen("shmid","w")
fwrite(&shmid, sizeof(int), 1, fp)
fwrite(&empty, sizeof(int), 1, fp)
fwrite(&full, sizeof(int), 1, fp)
fwrite(&mutex, sizeof(int), 1, fp)
fclose(fp)
pid = fork()
if(pid == 0){
execlp("./Msginput", "./Msginput",0)
perror("execlp")
exit(1)
}else{
while(1){
P(&full)
P(&mutex)
printf("%s\n", shm)
if(strcmp(shm,"END") == 0){
V(&mutex)
V(&empty)
break
}
V(&mutex)
V(&empty)
}
}
wait(0)
if(semctl(full, 0, IPC_RMID, 1) == -1){
perror("semctl")
exit(1)
}
if(semctl(empty, 0, IPC_RMID, 1) == -1){
perror("semctl")
exit(1)
}
if(semctl(mutex, 0, IPC_RMID, 1) == -1){
perror("semctl")
exit(1)
}
if(shmctl(shmid, IPC_RMID, NULL) == -1){
perror("shmctl")
exit(1)
}
exit(0)
}
/****Mysem.h*****/
void P(int *s)
void V(int *s)
extern void *shmat (int __shmid, __const void *__shmaddr, int __shmflg)
void P(int *s){
struct sembuf sembuffer, *sops
sops=&sembuffer
sops->sem_num = 0
sops->sem_op = -1
sops->sem_flg = 0
if(semop(*s, sops, 1)<0){
perror("semop")
exit(1)
}
return
}
void V(int *s){
struct sembuf sembuffer, *sops
sops = &sembuffer
sops->sem_num = 0
sops->sem_op = 1
sops->sem_flg = 0
if(semop(*s, sops, 1)<0){
perror("semop")
exit(1)
}
return
}
*** 作系统中常见的有苹果 *** 作系统、windows *** 作系统,另外还有一些国产的 *** 作系统。中兴新支点 *** 作系统、银河麒麟、中标麒麟Linux(原中标普华Linux)、起点 *** 作系统StartOS(原雨林木风 *** 作系统YLMF OS)、凝思磐石安全 *** 作系统、一铭 *** 作系统、凤凰系统、深度系统(deepin)。
国产 *** 作系统多为以Linux为基础二次开发的 *** 作系统。2014年4月8日起,美国微软公司停止了对Windows XP SP3 *** 作系统提供服务支持,这引起了社会和广喊枣大用户的广泛关注和对信息安全的担忧。而2020年对Windows7服务支持的终止再一次推动了国产系统的发展。
扩展资料:
*** 作系统现状:
优麒麟在内的国产Linux *** 作系统,在易用性等方面基本具备XP替代能力,但还存在生态环境差等各种问题。2013年末,国产电脑 *** 作系统红旗Linux遭遇“滑铁卢”,中科红旗软件技术有限公司经营发生严重困难,董事会于2013年12月13日决议从即日起解散公司。
但国产 *** 作系统的研发并未就此结束,国内还有多家公司在从事相关开发运营工作,而在世棚物界范链渗液围内,Linux系统的商业化运用也还处于方兴未艾的阶段。
参考资料来源:百度百科-国产 *** 作系统
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)