unix详细资料大全
UNIX作业系统(尤尼斯),是一个强大的多用户、多任务作业系统,支持多种处理器架构,按照作业系统的分类,属于分时作业系统,最早由KenThompson、Dennis Ritchie和Douglas McIlroy于1969年在AT&T的贝尔实验室开发。目前它的商标权由国际开放标准组织所拥有,只有符合单一UNIX规范的UNIX系统才能使用UNIX这个名称,否则只能称为类UNIX(UNIX-like)。
基本介绍 中文名 :Unix 本质 :作业系统 类型 :分时作业系统 开发 :1969年 公司 :AT&T 特点 :多用户、多任务 历史,诞生,流行,家谱,类UNIX,收费情况,UNIX标准,UNIX特性, 历史 诞生 1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的计画;该计画要建立一套多使用者、多任务、多层次(multi-user、multi-processor、multi-level)的MULTICS作业系统。直到1969年,因MULTICS计画的工作进度太慢,该计画被停了下来。当时,Ken Thompson(后被称为UNIX之父)已经有一个称为"星际旅行"的程式在GE-635的机器上跑,但是反应非常慢,正巧被他发现了一部被闲置的PDP-7(Digital的主机),Ken Thompson和Dernis Ritchie就将"星际旅行"的程式移植到PDP-7上。而这部PDP-7(如图1-1所示)就此在整个计算机历史上留下了芳名。 图1-1 PDP-7计算机 MULTICS其实是"Multiplexed Information and Computing Service"的缩写,在1970年时,那部PDP-7却只能支持两个使用者,当时,Brian Kernighan就开玩笑地称他们的系统其实是:"UNiplexed Information and Computing Service",缩写为"UNICS",后来,大家取其谐音,就称其为"UNIX"了。1970年可称为"UNIX元年"。 流行 1971年,Ken Thompson写了充分长篇的申请报告,申请到了一台PDP-11/24的机器。于是Unix第一版出来了。在一台PDP-11/24的机器上完成。这台电脑只有24KB的物理记忆体和500K磁碟空间。Unix占用了12KB的记忆体,剩下的一半记忆体可以支持两用户进行Space Travel的游戏。而著名的fork()系统调用也就是在这时出现的。 到了1973年的时候,Ken Thompson 与Dennis Ritchie感到用汇编语言做移植太过于头痛,他们想用高级语言来完成第三版,对于当时完全以汇编语言来开发程式的年代,他们的想法算是相当的疯狂。一开始他们想尝试用Fortran,可是失败了。后来他们用一个叫 BCPL (Basic Combined Programming Language)的语言开发,他们整合了BCPL形成 B语言 ,后来Dennis Ritchie觉得B语言还是不能满足要求,于是就改良了B语言,这就是今天的大名鼎鼎的 C语言 。于是,Ken Thompson 与Dennis Ritchie成功地用C语言重写了Unix的第三版核心。至此,Unix这个作业系统修改、移植相当便利,为Unix日后的普及打下了坚实的基础。而Unix和C完美地结合成为一个统一体,C与Unix很快成为世界的主导。 Unix Unix的第一篇文章 “The UNIX Time Sharing System”由Ken Thompson和Dennis Ritchie于1974年7月的 The Communications of the ACM发表。这是UNIX与外界的首次接触。结果引起了学术界的广泛兴趣并对其源码索取,所以,Unix第五版就以“仅用于教育目的”的协定,提供给各大学作为教学之用,成为当时作业系统课程中的范例教材。各大学公司开始通过Unix源码对Unix进行了各种各样的改进和扩展。于是,Unix开始广泛流行。 家谱 Unix在开发的过程中,没有任何的奖励制度和管理,从一开始在AT&T公司出现时,其是一种近似于好奇或兴趣的东西。 Unix家谱 然而,20世纪70年代,AT&T公司开始注意到Unix所带来的商业价值。公司的律师开始寻找一些手段来保护Unix,并让其成为一种商业机密。从1979年Unix的版本V7开始,Unix的许可证开始禁止大学使用Unix的源码,包括在授课中学习。 到了1980年,有两个最主要的Unix的版本线,一个是Berkeley的BSD UNIX,另一个是AT&T的Unix,在这个时候,很显然,竞争最终引发了Unix的战争。在这场战争中,好的是,软体开发人员还是能够得到Unix的源码并对其按照自己的需要和兴致进行裁剪。而不好的是,Unix开始一发不可收拾地开发不停地出现各种各样的变种。 1982年,Joy创建了Sun Microsystems公司并提供了工作站–Sun-1,运行SunOS(Solaris以之后的十年出现)。而AT&T则在随后的几年中发布了Unix System V的第一版,一个具有强大影响力的作业系统,最终造就了IBM的AIX和HP的HP-UX。 类UNIX AIX ( Advanced Interactive eXecutive )是 IBM 开发的一套UNIX作业系统。它符合Open group的UNIX 98行业标准(The Open Group UNIX 98 Base Brand),通过全面集成对32-位和64-位套用的并行运行支持,为这些套用提供了全面的可扩展性。它可以在所有的IBM ~ p系列和IBM RS/6000工作站、伺服器和大型并行超级计算机上运行。AIX的一些流行特性例如chuser、mkuser、rmuser命令以及相似的东西允许如同管理档案一样来进行用户管理。AIX级别的逻辑卷管理正逐渐被添加进各种自由的UNIX风格作业系统中。 Aix logo Solaris 是SUN公司研制的类Unix作业系统。直至2013年,Solaris的最新版为 Solaris 11。 solaris logo 早期的Solaris是由BSDUnix发展而来。这是因为升阳公司的创始人之一,比尔·乔伊(Bill Joy)来自加州大学伯克莱分校(UCBerkeley)。但是随着时间的推移,Solaris在接口上正在逐渐向System V靠拢,但至今Solaris仍旧属于私有软体。2005年6月14日,Sun公司将正在开发中的Solaris 11的原始码以CDDL许可开放,这一开放版本就是OpenSolaris。 Sun的作业系统最初叫做SunOS。SunOS 50开始,SUN的作业系统开发开始转向System V4,并且有了新的名字叫做Solaris 20。Solaris 26以后,SUN删除了版本号中的"2",因此,SunOS 510就叫做Solaris 10。Solaris的早期版本后来又被重新命名为Solaris 1x 所以"SunOS"这个词被用做专指Solaris作业系统的核心,因此Solaris被认为是由SunOS,图形化的桌面计算环境,以及它网路增强部分组成。 Solaris运行在两个平台:Intel x86及SPARC/UltraSPARC。后者是升阳工作站使用的处理器。因此,Solaris在SPARC上拥有强大的处理能力和硬体支援,同时Intel x86上的性能也正在得到改善。对这两个平台,Solaris禁止了底层平台差异,为用户提供了尽可能一样的使用体验。 HP-UX 取自 Hewlett Packard UniX ,是 惠普公司 (HP,Hewlett-Packard)以 System V为基础所研发成的类UNIX作业系统。HP-UX可以在HP的PA-RISC处理器、Intel的Itanium处理器的电脑上运行,另外过去也能用于后期的阿波罗电脑(Apollo/Domain)系统上。较早版本的HP-UX也能用于HP 9000系列200型、300型、400型的电脑系统(使用Motorola的68000处理器)上,和HP-9000系列500型电脑(使用HP专属的FOCUS处理器架构)。 HP-UX IRIX 是由矽谷图形公司( Silicon Graphics Inc ,一般用简称: SGI )以System V与BSD延伸程式为基础所发展成的UNIX作业系统,IRIX可以在SGI公司的RISC型电脑上运行,即是采行32位、64位MIPS架构的SGI工作站、伺服器。 IRIX Xenix 是一种UNIX作业系统,可在个人电脑及微型计算机上使用。该系统由 微软公司 在1979年从美国电话电报公司获得授权,为Intel处理器所开发。后来,SCO公司收购了其独家使用权,自那以后,该公司开始以SCO UNIX(亦被称作SCO OpenServer)为名发售。值得一提的是,它还能在DECPDP-11或是Apple Lisa电脑运行。它继承了UNIX的特性,Xenix具备了多人多任务的工作环境,符合 UNIX System V 的接口规格 (SVID)。 A/UX (取自Apple Unix)是 苹果电脑 (Apple Computer)公司所开发的UNIX作业系统,此作业系统可以在该公司的一些麦金塔电脑(Macintosh)上运行,最末(或说最新)的一套A/UX是在Macintosh II、Quadra及Centris等系列的电脑上运行。A/UX于1988年首次发表,最终的版本为311版,于1995年发表。A/UX至少需要一颗具有浮点运算单元及标签页式的存储器管理单元(Paged Memory Management Unit,PMMU)的68k处理器才能运行。 A/UX是以 System V 22 版为基础所发展,并且也使用System V 3(简称:SysV 3)、System V 4、BSD 42、BSD 43等的传统特色,它也遵循POSIX规范及SVID规范,不过遵循标准版本就难以支持最新的信息技术,因此在之后的第二版便开始加入TCP/IP网路功能。有传言表示有一个后续版本是以OSF/1为主要的代码基础,但却从未公开发表过,不过无从证实此版本是否真存在过。 收费情况 UNIX作业系统是 商业版 ,需要收费,价格比Microsoft Windows正版要贵一些。不过UNIX有免费版的,例如:NetBSD等类似UNIX版本。 UNIX标准 UNIX用户协会最早从20世纪80年代开始标准化工作,1984年颁布了试用标准。后来IEEE为此制定了POSIX标准(即IEEE1003标准)国际标准名称为ISO/IEC9945它通过一组最小的功能定义了在UNIX作业系统和应用程式之间兼容的语言接口。POSIX是由Richard Stallman 应IEEE的要求而提议的一个易于记忆的名称,含义是Portable OPerating System Interface(可移植作业系统接口) ,而X表明其API的传承。 UNIX特性 UNIX系统是一个多用户,多任务的分时作业系统。 UNIX的系统结构可分为三部分:作业系统核心(是UNIX系统核心管理和控制中心,在系统启动或常驻记忆体),系统调用(供程式开发者开发应用程式时调用系统组件,包括进程管理,档案管理,设备状态等),应用程式(包括各种开发工具,编译器,网路通讯处理程式等,所有应用程式都在Shell的管理和控制下为用户服务)。 UNIX系统大部分是由C语言编写的,这使得系统易读,易修改,易移植。 UNIX提供了丰富的,精心挑选的系统调用,整个系统的实现十分紧凑,简洁。 UNIX提供了功能强大的可程式的Shell语言(外壳语言)作为用户界面具有简洁,高效的特点。 UNIX系统采用树状目录结构,具有良好的安全性,保密性和可维护性。 UNIX系统采用进程对换(Swapping)的记忆体管理机制和请求调页的存储方式,实现了虚拟记忆体管理,大大提高了记忆体的使用效率。 UNIX系统提供多种通信机制,如:管道通信,软中断通信,讯息通信,共享存储器通信,信号灯通信。
第一个是简单的表结构,可以使用数组或链表来实现。
节点数据:
struct student{
char number[13];
char name[20];
enum gender;
int age;
char address[200];
}
无论数组和链表都可以直接抄书;
第二个问题,是一个树结构
通常二叉树就可以实现该功能,有很多家谱二叉树的实现可以参考。
郭氏家谱,入 朝 国 成 延 ,唯 金 照 祖 德,红 玉 显 宗 荣,如 绍 传 世 吉,付 桂 振 佳 生。
郭姓的由来:
1、出自夏、商时代郭支z与郭崇的后代。据《姓氏考略》记载:"夏有郭支,见《抱朴子》。商有郭崇,见《三一经》,此郭氏之始。"看来,郭姓早在我国四千多年以前的夏朝就有了。
2、以居处为氏。拒《风俗通》上记载:"氏于居者,城、郭、园、池是也。"郭,字义为外城,即因住在城外,而以郭为氏。在我国大多数的姓氏起源中,这种现象是比较少的。
3、来自炎黄,出自姬姓,古代"郭"与"虢"两字相通,郭氏即为虢氏,为黄帝姬姓后裔。周武王时封文王弟虢叔(一说虢仲)于西虢,虢仲(一说虢叔)于东虢。周平王时,郑武公功灭郐和东虢,建立郑国,都今河南新郑,此时平王也不得不认可,并名正言顺地将虢叔之地分封给郑武公。周平王的作法引起了诸侯王的不满。
于是,位于南方的楚国,从楚庄王时起不断发动对周的战争,兼并了周围许多国家。被分封给郑国的虢叔之地就是其中之一。周平王不得不将东虢叔的裔孙序封于阳曲作为补救。由此,号曰"虢公"。因虢、郭音同,又称"郭公",其后代遂有郭氏。
西虢,亦称成虢,在西周灭亡之后,也向东迁移,建都上阳,史称南虢。后被晋国所灭。西虢东迁时,还有虢国支族留居原地,史称小虢。后被秦所灭。这些虢国的后代,均以郭为姓。
4、出自冒姓或改姓。如后梁有成纳,后冒姓郭氏;后晋有郭金海,本突厥人,改姓汉姓;后周太祖郭威,本常氏子,幼随母适郭氏,故改姓郭。
扩展资料:
郭氏族谱,汾阳王郭子仪的后裔,主要分支:
1、九子东大郭分:
定远西南九子东大郭,发脉于江西瓦西坝,约在明末清初,始祖郭道迁于现在东大郭居住地。至今约340年左右,人口在2000人以上。
始祖郭道,二世祖天光,三世郭涛,四世祖永贵,均葬在杨马村马家家西庄南500米处的小南山和庄北小山上。在清朝中期,本分支备份较乱,由秀才郭春棠为首立了二十八个字辈,使九子东大郭、永康北郭、吴圩西郭统一辈分。
早年本地连年灾荒,一部分人携带郭氏家谱前往舒城境内,落居某山洼,历城山洼郭(此族谱没记录)。
1962年冬,本氏祭祖上坟,当时根据各家所存牌位,重新修订,但已经不完全了,后在文革期间全部损失。居原地的叫东大郭;迁往吴圩西的叫南郭(现在叫吴圩西郭);迁往永康南的叫北郭。
2、九子西大郭分支:
九子西大郭,发脉于江西瓦西坝,约在明末清初,郭正乡公和妻侯氏迁居九子西大郭,该村500米处有祖墓,谱中列有十八房。
3、二龙郭分支:
二龙(郭李童)郭氏,发脉于江苏句容,后于清末从肥东向导乡小郭村迁到此,始迁者一人名讳无法追远,现其坟墓仍存于郭李童村民聚居处西南角,称“老祖坟”,二龙(徐湖)郭氏,亦发脉江苏句容于清末从肥东向导乡郭吴迁到此,始迁者名讳无法追远,现其坟墓仍存于郭吴村。
4、天河郭分支:
天河郭发脉于山西太原,约清朝中期郭氏兄弟数人迁居天河,定居在上、下郭。后因修水库,下郭搬迁分散居住。谱中列为上郭中份、上郭东份、上郭西份和下郭份。其中上郭中份子嗣尤众。始祖墓坐落于现上郭。
5、西卅店金山郭分支:
原籍山东新泰县(现在的泰安市)郭庄,于清末郭方清迁至定远西卅店金山郭。
6、严桥郭分支:
祖籍何地,无法追远。
7、张桥大路郭分支:
发脉江西瓦西坝。约在明末清初郭氏兄弟两人(名讳不详)和表弟迁居现在的大路郭,兄弟两人仅长兄生有五男,朱氏无后裔。现在大路郭有三座始祖墓,谱中列有六房。
就是五代人或者五辈人的意思;
如果从自己开始往上算:自己算是一伏,其次是父亲、祖父、曾祖父、高祖;
如果自己开始往下算:自己算是一伏,其次是儿子、孙子、重孙、玄孙,这样就算是“五伏”之内了;
扩展资料
按照一般人的逻辑,都是从自己算起,往上或者往下五个辈分,也有的地方,会从一个血缘关系最近的共同祖辈开始,往下算五代,五伏之内属于一个老祖宗,而五伏之外的,只能算是同宗同姓,就没有比较亲近的血缘关系了。按照现代的医学常识来看,五伏以内禁止通婚,对于后代子女的健康成长,都是非常科学的,有利于提升生育质量。
五伏在古代,还有另外的一套讲究,今天说的五伏,是伏天的伏,在古代五伏的伏是衣服的,按照古代的丧葬制度,家里有老人去世了,五服之内的人都要穿丧服守孝,这里的“五服”值得就是是古代丧葬制度的五个等级,由近及远分为甸服﹑侯服﹑宾服)﹑要服﹑荒服,合称五服。
按照古代丧葬制度,“五服”有两种算法,从自己开始往上算,自己算是一服,其次是父亲、祖父、曾祖父、高祖,另外的算法是从自己开始往下算,自己算是一服,其次是儿子、孙子、重孙、玄孙,这样就算是“五服”之内了,而出了这个范围,就算是出五伏了,只要才不会了五伏,即使有老人去世,也不需要再穿丧服守孝。
参考资料
:五伏
一、西平赵氏
北宋庆历年间,陕西赵懿甫官居汝南节度使,后家居汝南城东五里屯。传十世至希贤(号龙华)由汝南迁蔡州。元末至正年间,赵希贤之后赵伊官至盐运使司通判, 由上蔡县白圭庙东徐赵庄迁西平县专探乡赵老庄。赵伊之子赵仲来系明正德年间贡生,为西平赵氏之始祖。
二、指鹿为马
秦始皇驾崩时,宦官赵高和始皇第十八子胡亥串通一气,假传圣旨,逼迫本该继承皇位的大公子扶苏下台,改立胡亥继承帝位。胡亥做了皇帝,即人们所说的秦二世。由于赵高帮助胡亥称帝出了大力,所以胡亥拜赵高为丞相。
赵高做了丞相之后并不满足,还打算篡夺帝位,但是又害怕大臣们反对,于是便想先试一下自己的威信。一天,赵高趁文武百官朝见秦二世的时候,特地叫人牵一只鹿献给秦二世,并当着群臣的面指着鹿说:“这是马。”秦二世笑了笑说:“丞相弄错了,把鹿说成马了。”
赵高没有理他,高声地问大臣:“这到底是马还是鹿?”群臣们有的畏惧赵高而不敢言,有的直言为鹿,有的为了计好赵高就歪曲事实跟着说是马。过后,说实话的人全被赵高杀死了。
扩展资料:
民间传说特征:
传说既不是真实人物的传记,也不是历史事件的记录(其中可能包含着真实历史的某些因素),而是人民群众的艺术创作。许多传说把比较广泛的社会生活内容通过艺术概括而依托在某一历史人物、事件或某一自然物、人造物之上,达到历史的因素和历史的方式与文学创作的有机融合,使它成为艺术化的历史,或者是历史化的艺术。
-民间传说
以下程序已在win-tc和tc20下运行通过,已加详细注释(本人所写)。
/ 数据安全实用程序,加密解密简单程序 /
#include<stdioh>
#include<stdlibh>
#include<conioh>
int flag;
char encrypt(char ch,int key)/加密函数,把字符循环移位/
{
if(ch>='a' && ch<='z') / 如果是小写字母 /
{
ch=(ch-'a'+key%26)%26+'a'; / 字母向后移key%26个位置,超过字母z则再从a开始向后移动 /
}
else if(ch>='A' && ch<='Z') / 如果是大写字母 /
{
ch=(ch-'A'+key%26)%26+'A'; / 字母向后移key%26个位置,超过字母Z则再从A开始向后移动 /
}
return ch;
}
char decrypt(char ch,int key)/解密函数,把字符循环移位/
{
if(ch>='a' && ch<='z') / 如果是小写字母 /
{
ch=(ch-'a'+26-key%26)%26+'a'; / 字母向后移26-key%26个位置,超过字母z则再从a开始向后移动 /
}
else if(ch>='A' && ch<='Z') / 如果是大写字母 /
{
ch=(ch-'A'+26-key%26)%26+'A'; / 字母向后移26-key%26个位置,超过字母Z则再从A开始向后移动 /
}
return ch;
}
void menu()/菜单,1加密,2解密,3显示文本文件内容/
{
clrscr();
printf("\n=======================================================");
printf("\n1Encrypt the text file"); / 加密文件 /
printf("\n2Decrypt the text file"); / 解密文件 /
printf("\n3Display text file contents");/ 显示加密或解密或未加密或解密的文件 /
printf("\n4Quit\n");
printf("=========================================================\n");
printf("Please select a item:"); / 选择一个菜单 /
}
void logo()/显示程序信息/
{
printf("\nwelcome to encrypt program \n ");
return;
}
void encrypt_decrypt_File(char infile,int key, char outfile) / 加密或解密函数 /
{
FILE in,out;
char ch;
clrscr(); / 清屏 /
if((in=fopen(infile,"r"))==NULL) / 打开欲加密或解密的文件/
{
printf("Can not open the infile!\n"); / 如果打开文件失败或文件不存在打印打开失败信息 /
printf("Press any key to exit!\n");
getch(); / 并等待任一按键然后退出程序 /
exit(0);
}
if((out=fopen(outfile,"w"))==NULL) / 打开文件保存加密或解密后的内容/
{
printf("Can not open the outfile!\n"); / 如果打开文件失败或文件不存在打印打开失败信息 /
printf("Press any key to exit!\n"); / 并等待任一按键然后退出程序 /
fclose(in); / 关闭输入文件 /
getch(); / 等待按键,按任一键退出程序 /
exit(0);
}
ch=fgetc(in); /从文本文件中读入字符/
while(ch!=EOF)/加密或解密/
{
/如果是英文字符,则进行加密或解密,否则,不进行加密或解密处理/
if((ch>='a' && ch<='z' ) || (ch>='A' && ch<='Z'))
{ if(flag==1)
fputc(encrypt(ch,key),out);
if(flag==2)
fputc(decrypt(ch,key),out);
}
else
fputc(ch,out);
ch=fgetc(in);
}
/关闭输入及输出文件/
fclose(in);
fclose(out);
}
void displayFile(char infile) /将文本文件的内容显示在屏幕上/
{
FILE fp;
char string[81];
if((fp=fopen(infile,"r"))==NULL) / 以只读方式打开文本文件 /
{
printf("cann't open file");exit(0); / 如果文件不存在或打开失败打印无法打开信息并退出程序 /
}
while(fgets(string,81,fp)!=NULL)
fputs(string,stdout); /把所取字符串送到屏幕显示/
fclose(fp); / 关闭文件 /
}
int main()
{
int i,n;
char ch0,ch1;
char infile[40],outfile[40];
textbackground(LIGHTGRAY); /设置背景颜色为浅灰色/
textcolor(BLACK); /设置文字颜色为黑色/
clrscr();/清除屏幕显示/
logo(); /显示程序信息/
sleep(2); / 延时2秒 /
menu(); /显示屏幕菜单/
ch0=getche();/等待用户从键盘输入,并把输入显示在屏幕上/
while(ch0!='4')
{
clrscr();
if(ch0=='1') /选择加密功能/
{
flag=1;
printf("\nPlease input the infile to be encrypted:"); / 输入要加密的文件名 /
scanf("%s",infile); / 该文件要和本程序放在同一个目录下 /
printf("Please input the encrypt key:");
scanf("%d",&n);/输入加密密码/
printf("Please input the outfile:"); /输入存放加密内容的文件名/
scanf("%s",outfile); / 该文件可以自动创建 /
encrypt_decrypt_File(infile,n,outfile);
printf("\nEncrypt is over!\n");/ 加密成功 /
sleep(1); / 延时1秒 /
}
else if(ch0=='2') /选择解密功能/
{
flag=2;
printf("\nPlease input the infile to be decrypted:"); / 输入要解密的文件名 /
scanf("%s",infile); / 该文件要和本程序放在同一个目录下 /
printf("Please input the decrypt key:");
scanf("%d",&n);/输入解密密码,加密和解密密码应相同/
printf("Please input the outfile:"); /输入存放解密内容的文件名/
scanf("%s",outfile); / 该文件可以自动创建 /
encrypt_decrypt_File(infile,n,outfile);
printf("\nDecrypt is over!\n");
sleep(1); / 延时1秒 /
}
else if(ch0=='3') /选择显示文本文件功能/
{
printf("\nPlease input the infile to be displayed:"); / 输入要显示的文件名 /
scanf("%s",infile);
displayFile(infile);/ 显示文件 /
getch();
}
else
{ /不合法输入/
printf("\nplease input a valid number(1-4)\n");
sleep(1); / 延时1秒 /
}
menu();/显示程序菜单/
ch0=getche(); /等待用户下一次的功能选择/
}
system("cls");/清除屏幕/
logo(); /显示程序信息/
printf("\nGood Bye!\n");
sleep(2);/ 延时2秒 /
system("pause"); / 暂停,按任一键退出程序 /
return 0;
}
unix详细资料大全
本文2023-10-07 20:35:07发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/200249.html