展开全部
操作系统中常见的有苹果操作系统、windows操作系统,另外还有一些国产的操作系统。中兴新支点操作系统、银河麒麟、中标麒麟Linux(原中标普华Linux)、起点操作系统StartOS(原雨林木风操作系统YLMF OS)、凝思磐石安全操作系统、一铭操作系统、凤凰系统、深度系统(deepin)。
国产操作系统多为以Linux为基础二次开发的操作系统。2014年4月8日起,美国微软公司停止了对Windows XP SP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。而2020年对Windows7服务支持的终止再一次推动了国产系统的发展。
扩展资料:
操作系统现状:
优麒麟在内的国产Linux操作系统,在易用性等方面基本具备XP替代能力,但还存在生态环境差等各种问题。2013年末,国产电脑操作系统红旗Linux遭遇“滑铁卢”,中科红旗软件技术有限公司经营发生严重困难,董事会于2013年12月13日决议从即日起解散公司。
但国产操作系统的研发并未就此结束,国内还有多家公司在从事相关开发运营工作,而在世界范围内,Linux系统的商业化运用也还处于方兴未艾的阶段。
参考资料来源:百度百科-国产操作系统
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
展开全部
操作系统是一种特殊的用于控制计算机(硬件)的程序(软件)。它是计算机底层的系统软件,负责管理、调度、指挥计算机的软硬件资源使其协调工作,没有它,任何计算机都无法正常运行。它在资源使用者和资源之间充当中间人的角色,举个例子,一个用户(也可以是程序)将一个文件存盘,操作系统就会开始工作:管理磁盘空间的分配,将要保存的信息由内存写到磁盘等。当用户要运行一个程序时,操作系统必须先将程序载入内存,当程序执行时,操作系统会让程序使用CPU。
在计算机的发展过程中,出现过许多不同的操作系统,其中最为常用的有:DOS、Mac OS、Windows、Linux、Free BSD、Unix/Xenix、OS/2等等,下面介绍常见的微机操作系统的发展过程和功能特点。
一、 DOS操作系统
从1981年问世至今,DOS经历了7次大的版本升级,从1.0版到现在的7.0
版,不断地改进和完善。但是,DOS系统的单用户、单任务、字符界面和16位的大格局没有变化,因此它对于内存的管理也局限在640KB的范围内。 DOS最初是微软公司为IBM-PC开发的操作系统,因此它对硬件平台的要求很低,因此适用性较广。常用的DOS有三种不同的品牌,它们是Microsoft公司的MS-DOS、IBM公司的PC-DOS以及Novell公司的DR DOS,这三种DOS相互兼容,但仍有一些区别,三种DOS中使用最多的是MS-DOS。
DOS系统有众多的通用软件支持,如各种语言处理程序、数据库管理系统、文字处理软件、电子表格。而且围绕DOS开发了很多应用软件系统,如财务、人事、统计、交通、医院等各种管理系统。鉴于这个原因,尽管DOS已经不能适应32位机的硬件系统,但是仍广泛流行,不过DOS被市场淘汰应该只是时间问题
二、 Mac OS 操作系统
Mac OS操作系统是美国苹果计算机公司为它的Macintosh计算机设计的操作系统的一代操作系统,该机型于1984年推出,在当时的PC还只是DOS枯燥的字符界面的时候,Mac率先采用了一些我们至今仍为人称道的技术。比如:GUI图形用户界面、多媒体应用、鼠标等,Macintosh计算机在出版、印刷、影视制作和教育等领域有着广泛的应用,Microsoft Windows至今在很多方面还有Mac的影子,最近苹果公司又发布了目前最先进的个人电脑操作系统Mac OS X。
三、Windows系统
Windows是Microsoft公司在1985年11月发布的第一代窗口式多任务系统,它使PC机开始进入了所谓的图形用户界面时代。在图形用户界面中,每一种应用软件(即由Windows支持的软件)都用一个图标(Icon)表示,用户只需把鼠标移到某图标上,连续两次按下鼠标器的拾取键即可进入该软件,这种界面方式为用户提供了很大的方便,把计算机的使用提高到了一个新的阶段。
Windows1.X版是一个具有多窗口及多任务功能的版本,但由于当时的硬件平台为PC/XT,速度很慢,所以Windows1.X版本并未十分流行。1987年底Microsoft公司又推出了MS-Windows2.X 版,它具有窗口重叠功能,窗口大小也可以调整,并可把扩展内存和扩充内存作为磁盘高速缓存,从而提高了整台计算机的性能,此外它还提供了众多的应用程序:文本编辑Write、记事本Notepad、计算器Calculator、日历Calendar……等。随后在88年、89年又先后推出了MS-Windows/286-V2.1和MS-Windows/386 V2.1这两个版本。
1990年,Microsoft公司推出了Windows3.0,它的功能进一步加强,具有强大的内存管理,且提供了数量相当多的Windows应用软件,因此成为386、486微机新的操作系统标准。随后,Windows发表3.1版,而且推出了相应的中文版。3.1版较之3.0版增加了一些新的功能,受到了用户欢迎,是当时最流行的Windows版本。
1995年,Microsoft公司推出了Windows95。在此之前的Windows都是由DOS引导的,也就是说它们还不是一个完全独立的系统,而Windows95是一个完全独立的系统,并在很多方面作了进一步的改进,还集成了网络功能和即插即用(Plug and Play)功能,是一个全新的32位操作系统。
1998年,Microsoft公司推出了Windows95的改进版Windows98,Windows98的一个最大特点就是把微软的Internet浏览器技术整合到了Windows里面,使得访问Internet资源就像访问本地硬盘一样方便,从而更好地满足了人们越来越多的访问Internet资源的需要。Windows98是目前实际使用的主流操作系统。
在90年代初期Microsoft推出了Windows NT(NT是New Technology即新技术的缩写)来争夺Novell Netware的网络操作系统市场。相继有Windows NT 3.0,3.5,4.0等版本上市,逐渐蚕食了中小网络操作系统的大半江山。WindowsNT是真正的32位操作系统,与普通的Windows系统不同,它主要面向商业用户,有服务器版和工作站版之分。
2000年,Microsoft公司推出了Windows 2000,它包括四个版本:Data center Server是功能最强大的服务器版本,只随服务器捆绑销售,不零售;Advanced Server和Server版是一般服务器使用;Professional版是工作站版本的NT和Windows98共同的升级版本。
目前还有一个主要面向家庭和个人娱乐,侧重于多媒体和网络的Windows Me存在。
2001年10月25日,Microsoft发布了功能及其强大的Windows XP,该系统采用Windows 2000/NT内核,运行非常可靠、稳定,用户界面焕然一新,使用起来得心应手,这次微软终于可以和苹果的Macintosh软件一争高下了,优化了与多媒体应用有关的功能,内建了极其严格的安全机制,每个用户都可以拥有高度保密的个人特别区域,尤其是增加了具有防盗版作用的激活功能。
四、Unix系统
Unix系统是1969年在贝尔实验室诞生,最初是在中小型计算机上运用。最早移植到80286微机上的Unix系统,称为Xenix。 Xenix系统的特点是短小精干,系统开销小,运行速度快。UNIX为用户提供了一个分时的系统以控制计算机的活动和资源,并且提供一个交互,灵活的操作界。UNIX被设计成为能够同时运行多进程,支持用户之间共享数据。同时,UNIX支持模块化结构,当你安装UNIX操作系统时,你只需要安装你工作需要的部分,例如:UNIX支持许多编程开发工具,但是如果你并不从事开发工作,你只需要安装最少的编译器。用户界面同样支持模块化原则,互不相关的命令能够通过管道相连接用于执行非常复杂的操作。UNIX 有很多种,许多公司都有自己的版本,如 AT&T、Sun、HP等。
五、Linux系统
Linux是当今电脑界一个耀眼的名字,它是目前全球最大的一个自由免费软件,其本身是一个功能可与Unix和Windows相媲美的操作系统,具有完备的网络功能,它的用法与UNIX非常相似,因此许多用户不再购买昂贵的UNIX,转而投入Linux等免费系统的怀抱。
Linux最初由芬兰人Linus Torvalds开发,其源程序在Internet网上公开发布,由此,引发了全球电脑爱好者的开发热情,许多人下载该源程序并按自己的意愿完善某一方面的功能,再发回网上,Linux也因此被雕琢成为一个全球最稳定的、最有发展前景的操作系统。曾经有人戏言:要是比尔·盖茨把Windows的源代码也作同样处理,现在Windows中残留的许多BUG(错误)早已不复存在,因为全世界的电脑爱好者都会成为Windows的义务测试和编程人员。
Linux操作系统具有如下特点:
1. 它是一个免费软件,您可以自由安装并任意修改软件的源代码。
2. Linux操作系统与主流的UNIX系统兼容,这使得它一出现就有了一个很好的用户群。
3. 支持几乎所有的硬件平台,包括Intel系列,680x0系列,Alpha系列,MIPS系列等,并广泛支持各种周边设备。
目前,Linux正在全球各地迅速普及推广,各大软件商如Oracle、Sybase、Novell、IBM等均发布了Linux版的产品,许多硬件厂商也推出了预装Linux操作系统的服务器产品,还有不少公司或组织有计划地收集有关Linux的软件,组合成一套完整的Linux发行版本上市,比较著名的有RedHat(即红帽子)、Slackware等公司。Linux可以在相对低价的Intel X86硬件平台上实现高档系统才具有的性能, 许多用户使用benchmarks在运行Linux的X86机器上测试, 发现可以和Sun和Digital公司的中型工作站的性能媲美。事实上不光是许多爱好者和程序员在使用Linux, 许多商业用户比如Internet服务供应商(ISP)也使用Linux做为服务器代替昂贵的工作站。 这些服务器的最高记录是经过600天的运行没有碰到一次系统崩溃!我们有理由相信Linux这样一个稳定、灵活和易用的软件,肯定会得到越来越广泛的应用。
除了 Linux之外还有一种免费的UNIX变种操作系统FreeBSD可供使用,一般来说,对于工作站而言, LINUX支持的硬件种类和数量要远远地超过FreeBSD,而在网络的负载非常高时, FreeBSD的性能比LINUX 要好一些。
六、OS/2系统
1987年IBM公司在激烈的市场竞争中推出了PS/2(Personal System/2)个人电脑。PS/2系列电脑大幅度突破了现行PC机的体系,采用了与其它总线互不兼容的微通道总线MCA,并且IBM自行设计了该系统约80%的零部件,以防止其它公司仿制。OS/2系统正是为系列机开发的一个新型多任务操作系统。OS/2克服了DOS系统640KB主存的限制,具有多任务功能。OS/2也采用图形界面,它本身是一个32位系统,不仅可以处理32位OS/2系统的应用软件,也可以运行16位DOS和Windows软件。 OS/2系统通常要求在4MB内存和100MB硬盘或更高的硬件环境下运行。由于OS/2 仅限于PS/2机型,兼容性较差,故而限制了它的推广和应用。
服务器用2003的
在计算机的发展过程中,出现过许多不同的操作系统,其中最为常用的有:DOS、Mac OS、Windows、Linux、Free BSD、Unix/Xenix、OS/2等等,下面介绍常见的微机操作系统的发展过程和功能特点。
一、 DOS操作系统
从1981年问世至今,DOS经历了7次大的版本升级,从1.0版到现在的7.0
版,不断地改进和完善。但是,DOS系统的单用户、单任务、字符界面和16位的大格局没有变化,因此它对于内存的管理也局限在640KB的范围内。 DOS最初是微软公司为IBM-PC开发的操作系统,因此它对硬件平台的要求很低,因此适用性较广。常用的DOS有三种不同的品牌,它们是Microsoft公司的MS-DOS、IBM公司的PC-DOS以及Novell公司的DR DOS,这三种DOS相互兼容,但仍有一些区别,三种DOS中使用最多的是MS-DOS。
DOS系统有众多的通用软件支持,如各种语言处理程序、数据库管理系统、文字处理软件、电子表格。而且围绕DOS开发了很多应用软件系统,如财务、人事、统计、交通、医院等各种管理系统。鉴于这个原因,尽管DOS已经不能适应32位机的硬件系统,但是仍广泛流行,不过DOS被市场淘汰应该只是时间问题
二、 Mac OS 操作系统
Mac OS操作系统是美国苹果计算机公司为它的Macintosh计算机设计的操作系统的一代操作系统,该机型于1984年推出,在当时的PC还只是DOS枯燥的字符界面的时候,Mac率先采用了一些我们至今仍为人称道的技术。比如:GUI图形用户界面、多媒体应用、鼠标等,Macintosh计算机在出版、印刷、影视制作和教育等领域有着广泛的应用,Microsoft Windows至今在很多方面还有Mac的影子,最近苹果公司又发布了目前最先进的个人电脑操作系统Mac OS X。
三、Windows系统
Windows是Microsoft公司在1985年11月发布的第一代窗口式多任务系统,它使PC机开始进入了所谓的图形用户界面时代。在图形用户界面中,每一种应用软件(即由Windows支持的软件)都用一个图标(Icon)表示,用户只需把鼠标移到某图标上,连续两次按下鼠标器的拾取键即可进入该软件,这种界面方式为用户提供了很大的方便,把计算机的使用提高到了一个新的阶段。
Windows1.X版是一个具有多窗口及多任务功能的版本,但由于当时的硬件平台为PC/XT,速度很慢,所以Windows1.X版本并未十分流行。1987年底Microsoft公司又推出了MS-Windows2.X 版,它具有窗口重叠功能,窗口大小也可以调整,并可把扩展内存和扩充内存作为磁盘高速缓存,从而提高了整台计算机的性能,此外它还提供了众多的应用程序:文本编辑Write、记事本Notepad、计算器Calculator、日历Calendar……等。随后在88年、89年又先后推出了MS-Windows/286-V2.1和MS-Windows/386 V2.1这两个版本。
1990年,Microsoft公司推出了Windows3.0,它的功能进一步加强,具有强大的内存管理,且提供了数量相当多的Windows应用软件,因此成为386、486微机新的操作系统标准。随后,Windows发表3.1版,而且推出了相应的中文版。3.1版较之3.0版增加了一些新的功能,受到了用户欢迎,是当时最流行的Windows版本。
1995年,Microsoft公司推出了Windows95。在此之前的Windows都是由DOS引导的,也就是说它们还不是一个完全独立的系统,而Windows95是一个完全独立的系统,并在很多方面作了进一步的改进,还集成了网络功能和即插即用(Plug and Play)功能,是一个全新的32位操作系统。
1998年,Microsoft公司推出了Windows95的改进版Windows98,Windows98的一个最大特点就是把微软的Internet浏览器技术整合到了Windows里面,使得访问Internet资源就像访问本地硬盘一样方便,从而更好地满足了人们越来越多的访问Internet资源的需要。Windows98是目前实际使用的主流操作系统。
在90年代初期Microsoft推出了Windows NT(NT是New Technology即新技术的缩写)来争夺Novell Netware的网络操作系统市场。相继有Windows NT 3.0,3.5,4.0等版本上市,逐渐蚕食了中小网络操作系统的大半江山。WindowsNT是真正的32位操作系统,与普通的Windows系统不同,它主要面向商业用户,有服务器版和工作站版之分。
2000年,Microsoft公司推出了Windows 2000,它包括四个版本:Data center Server是功能最强大的服务器版本,只随服务器捆绑销售,不零售;Advanced Server和Server版是一般服务器使用;Professional版是工作站版本的NT和Windows98共同的升级版本。
目前还有一个主要面向家庭和个人娱乐,侧重于多媒体和网络的Windows Me存在。
2001年10月25日,Microsoft发布了功能及其强大的Windows XP,该系统采用Windows 2000/NT内核,运行非常可靠、稳定,用户界面焕然一新,使用起来得心应手,这次微软终于可以和苹果的Macintosh软件一争高下了,优化了与多媒体应用有关的功能,内建了极其严格的安全机制,每个用户都可以拥有高度保密的个人特别区域,尤其是增加了具有防盗版作用的激活功能。
四、Unix系统
Unix系统是1969年在贝尔实验室诞生,最初是在中小型计算机上运用。最早移植到80286微机上的Unix系统,称为Xenix。 Xenix系统的特点是短小精干,系统开销小,运行速度快。UNIX为用户提供了一个分时的系统以控制计算机的活动和资源,并且提供一个交互,灵活的操作界。UNIX被设计成为能够同时运行多进程,支持用户之间共享数据。同时,UNIX支持模块化结构,当你安装UNIX操作系统时,你只需要安装你工作需要的部分,例如:UNIX支持许多编程开发工具,但是如果你并不从事开发工作,你只需要安装最少的编译器。用户界面同样支持模块化原则,互不相关的命令能够通过管道相连接用于执行非常复杂的操作。UNIX 有很多种,许多公司都有自己的版本,如 AT&T、Sun、HP等。
五、Linux系统
Linux是当今电脑界一个耀眼的名字,它是目前全球最大的一个自由免费软件,其本身是一个功能可与Unix和Windows相媲美的操作系统,具有完备的网络功能,它的用法与UNIX非常相似,因此许多用户不再购买昂贵的UNIX,转而投入Linux等免费系统的怀抱。
Linux最初由芬兰人Linus Torvalds开发,其源程序在Internet网上公开发布,由此,引发了全球电脑爱好者的开发热情,许多人下载该源程序并按自己的意愿完善某一方面的功能,再发回网上,Linux也因此被雕琢成为一个全球最稳定的、最有发展前景的操作系统。曾经有人戏言:要是比尔·盖茨把Windows的源代码也作同样处理,现在Windows中残留的许多BUG(错误)早已不复存在,因为全世界的电脑爱好者都会成为Windows的义务测试和编程人员。
Linux操作系统具有如下特点:
1. 它是一个免费软件,您可以自由安装并任意修改软件的源代码。
2. Linux操作系统与主流的UNIX系统兼容,这使得它一出现就有了一个很好的用户群。
3. 支持几乎所有的硬件平台,包括Intel系列,680x0系列,Alpha系列,MIPS系列等,并广泛支持各种周边设备。
目前,Linux正在全球各地迅速普及推广,各大软件商如Oracle、Sybase、Novell、IBM等均发布了Linux版的产品,许多硬件厂商也推出了预装Linux操作系统的服务器产品,还有不少公司或组织有计划地收集有关Linux的软件,组合成一套完整的Linux发行版本上市,比较著名的有RedHat(即红帽子)、Slackware等公司。Linux可以在相对低价的Intel X86硬件平台上实现高档系统才具有的性能, 许多用户使用benchmarks在运行Linux的X86机器上测试, 发现可以和Sun和Digital公司的中型工作站的性能媲美。事实上不光是许多爱好者和程序员在使用Linux, 许多商业用户比如Internet服务供应商(ISP)也使用Linux做为服务器代替昂贵的工作站。 这些服务器的最高记录是经过600天的运行没有碰到一次系统崩溃!我们有理由相信Linux这样一个稳定、灵活和易用的软件,肯定会得到越来越广泛的应用。
除了 Linux之外还有一种免费的UNIX变种操作系统FreeBSD可供使用,一般来说,对于工作站而言, LINUX支持的硬件种类和数量要远远地超过FreeBSD,而在网络的负载非常高时, FreeBSD的性能比LINUX 要好一些。
六、OS/2系统
1987年IBM公司在激烈的市场竞争中推出了PS/2(Personal System/2)个人电脑。PS/2系列电脑大幅度突破了现行PC机的体系,采用了与其它总线互不兼容的微通道总线MCA,并且IBM自行设计了该系统约80%的零部件,以防止其它公司仿制。OS/2系统正是为系列机开发的一个新型多任务操作系统。OS/2克服了DOS系统640KB主存的限制,具有多任务功能。OS/2也采用图形界面,它本身是一个32位系统,不仅可以处理32位OS/2系统的应用软件,也可以运行16位DOS和Windows软件。 OS/2系统通常要求在4MB内存和100MB硬盘或更高的硬件环境下运行。由于OS/2 仅限于PS/2机型,兼容性较差,故而限制了它的推广和应用。
服务器用2003的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
static int set_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);
static void del_sem_set(void);
/* 定义自己的semun联合体*/
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
/* 定义全局变量sem_id保存信号量集的标识符*/
static int sem_id;
/* 定义全局变量shm_id保存共享内存的标识符*/
static int shm_id;
int main()
{
int i;
pid_t pid;
char ch1, ch2;
char* pData = NULL;
/* 创建信号量集*/
sem_id = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if(sem_id == -1) {
fprintf(stderr, "Failed to create semaphore set. \n");
exit(EXIT_FAILURE);
}
if(!set_semvalue()) { /* 设置信号量的值*/
fprintf(stderr, "Failed to initialize semaphore\n");
exit(EXIT_FAILURE);
}
shm_id = shmget(IPC_PRIVATE, 4096, 0666 | IPC_CREAT);
if(shm_id == -1) {
fprintf(stderr, "Failed to create sharememory. \n");
del_sem_set();
exit(EXIT_FAILURE);
}
pid = fork(); /* 创建子进程*/
if(pid == -1) {
perror("fork failed");
shmctl(shm_id, IPC_RMID, 0); /* 删除共享内存*/
del_sem_set();
exit(EXIT_FAILURE);
}
else {
srand((unsigned int)getpid()); /* 为随机数播种*/
pData = (char*)shmat(shm_id, 0, 0); /* 绑定*/
if (pid == 0) { /* 子进程*/
do {
semaphore_p();
ch1 = *pData; /* 读*/
ch2 = *(pData + 1);
if(ch2 == '@') {
*pData = tolower(ch1); /* 写*/
*(pData + 1) = '#';
}
if(ch1 == 'Z') break;
semaphore_v();
sleep(1);
}while(1);
}
else { /* 父进程*/
for(i=0; i < 26; i++){
semaphore_p();
*pData = 'A' + rand() % 26; /* 写*/
if(i == 25) *pData = 'Z';
printf("%c", *pData);
*(pData + 1) = '@';
semaphore_v();
sleep(1);
do {
semaphore_p();
ch1 = *pData; /* 读*/
ch2 = *(pData + 1);
if(ch2 == '#') {
printf("%c", ch1);
fflush(stdout);
semaphore_v();
break;
}
semaphore_v();
}while(1);
}
}
shmdt(pData); /* 分离*/
}
if(pid > 0) { /* 父进程*/
wait(NULL); /* 等待子进程退出*/
shmctl(shm_id, IPC_RMID, 0); /* 删除共享内存*/
del_sem_set(); /* 删除信号量集*/
}
printf("\n%d - finished\n", getpid());
exit(EXIT_SUCCESS);
}
/* 设置信号量的值*/
static int set_semvalue(void)
{
union semun sem_union;
sem_union.val = 1;
if(semctl(sem_id, 0, SETVAL, sem_union) == -1)
return 0;
return 1;
}
/* P操作,获取信号量*/
static int semaphore_p(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1) {
fprintf(stderr, "semaphore_p failed/n");
return 0;
}
return 1;
}
/* V操作,释放信号量*/
static int semaphore_v(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1) {
fprintf(stderr, "semaphore_v failed/n");
return 0;
}
return 1;
}
/* 删除信号量集*/
static void del_sem_set(void)
{
union semun sem_union;
if(semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
fprintf(stderr, "Failed to delete semaphore/n");
}
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
static int set_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);
static void del_sem_set(void);
/* 定义自己的semun联合体*/
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
/* 定义全局变量sem_id保存信号量集的标识符*/
static int sem_id;
/* 定义全局变量shm_id保存共享内存的标识符*/
static int shm_id;
int main()
{
int i;
pid_t pid;
char ch1, ch2;
char* pData = NULL;
/* 创建信号量集*/
sem_id = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if(sem_id == -1) {
fprintf(stderr, "Failed to create semaphore set. \n");
exit(EXIT_FAILURE);
}
if(!set_semvalue()) { /* 设置信号量的值*/
fprintf(stderr, "Failed to initialize semaphore\n");
exit(EXIT_FAILURE);
}
shm_id = shmget(IPC_PRIVATE, 4096, 0666 | IPC_CREAT);
if(shm_id == -1) {
fprintf(stderr, "Failed to create sharememory. \n");
del_sem_set();
exit(EXIT_FAILURE);
}
pid = fork(); /* 创建子进程*/
if(pid == -1) {
perror("fork failed");
shmctl(shm_id, IPC_RMID, 0); /* 删除共享内存*/
del_sem_set();
exit(EXIT_FAILURE);
}
else {
srand((unsigned int)getpid()); /* 为随机数播种*/
pData = (char*)shmat(shm_id, 0, 0); /* 绑定*/
if (pid == 0) { /* 子进程*/
do {
semaphore_p();
ch1 = *pData; /* 读*/
ch2 = *(pData + 1);
if(ch2 == '@') {
*pData = tolower(ch1); /* 写*/
*(pData + 1) = '#';
}
if(ch1 == 'Z') break;
semaphore_v();
sleep(1);
}while(1);
}
else { /* 父进程*/
for(i=0; i < 26; i++){
semaphore_p();
*pData = 'A' + rand() % 26; /* 写*/
if(i == 25) *pData = 'Z';
printf("%c", *pData);
*(pData + 1) = '@';
semaphore_v();
sleep(1);
do {
semaphore_p();
ch1 = *pData; /* 读*/
ch2 = *(pData + 1);
if(ch2 == '#') {
printf("%c", ch1);
fflush(stdout);
semaphore_v();
break;
}
semaphore_v();
}while(1);
}
}
shmdt(pData); /* 分离*/
}
if(pid > 0) { /* 父进程*/
wait(NULL); /* 等待子进程退出*/
shmctl(shm_id, IPC_RMID, 0); /* 删除共享内存*/
del_sem_set(); /* 删除信号量集*/
}
printf("\n%d - finished\n", getpid());
exit(EXIT_SUCCESS);
}
/* 设置信号量的值*/
static int set_semvalue(void)
{
union semun sem_union;
sem_union.val = 1;
if(semctl(sem_id, 0, SETVAL, sem_union) == -1)
return 0;
return 1;
}
/* P操作,获取信号量*/
static int semaphore_p(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1) {
fprintf(stderr, "semaphore_p failed/n");
return 0;
}
return 1;
}
/* V操作,释放信号量*/
static int semaphore_v(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1) {
fprintf(stderr, "semaphore_v failed/n");
return 0;
}
return 1;
}
/* 删除信号量集*/
static void del_sem_set(void)
{
union semun sem_union;
if(semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
fprintf(stderr, "Failed to delete semaphore/n");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询