Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式

P703

Linux读写内存数据的三种方式

1、read  ,write方式会在用户空间和内核空间不断拷贝数据,占用大量用户内存空间,效率不高

2、内存映射方式把设备文件的内存映射到应用程序中的内存空间,直接处理设备内存,这是一种高效的方式。mmap函数就是这种方式

如果程序中使用了mmap方法,需要使用munmap方法删除内存映射

3、 用户指针方式,是内存片段由应用程序自己分配。

18.2.1 羞辱柱与软件许可  shame:羞耻
看到这个三个字,你可能会很吃惊。羞辱柱是什么?这得从ffmpeg的软件许可证说起。ffmpeg是一个跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证,具体是什么还要依据你选择的组件来定。如果你使用了其中一些使用GPL协议发布的模块,那么你必须使用GPL协议。可是就有些不自觉的家伙使用了ffmpeg的代码,却并没有遵守LGPL/GPL协议,也就是没有公开自己的源代码。ffmpeg开发组很生气,后果很严重,便将这些违反协议的公司/组织/个人的网址贴在他们的“耻辱柱”的网页上,准备与这些公司/组织/个人商讨解决版权争议。不过现在我访问这个叫“耻辱柱”的网页http:// ffmpeg.org/shame.html发现,网页虽然还能访问,但已经看不到名单了,看来他们还是给这些违法者留了一点面子,让他们自觉地公布代码,然后在付诸法律行动。
提起软件许可的问题,我觉得还是要认真对待。越来越多的自由软件(Free Software)使用GPL作为其授权声明,如果对GPL一点都不了解,有可能在使用自由软件时会违反GPL的授权。如果是个人或不正规的公司倒也无所谓,但如果是有规模的公司,恐怕会有被起诉的风险。GPL是GNU General Public License(GNU通用公共许可证)的缩写形式。出发点是代码的开源免费使用、以及引用、修改、衍生代码的开源免费使用,但不允许修改后和衍生的代码作为闭源的商业软件发布和销售。Linux提倡自由和分享的精神,所以Linux采用的是GPL协议。这也是为什么我们能用免费的各种Linux软件,包括商业公司的Linux和Linux上各种各样的由个人、组织以及商业软件公司开发的免费软件。
我们之前谈到的GStreamer采用的是LGPL协议。LGPL是GNU Lesser General Public License(GNU宽通用公共许可证)的缩写形式,旧称GNU Library General Public License(GNU库通用公共许可证)。基于LGPL的软件允许商业化销售,但不允许封闭源代码。如果你对遵循LGPL的软件进行任何改动或再次开发并予以发布,则你的产品必须继承LGPL协议,不允许封闭源代码。但是如果你的程序对遵循LGPL的软件进行的是连接、调用而不是包含,则允许封闭源代码。明白了吧?下图描绘了GPL和LGPL协议的要求。

我们开发的软件究竟采用GPL好,还是LGPL好呢?这个问题实际上是个策略问题。由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,如果是商业或者对代码有保密要求的软件就不适合集成或采用使用GPL协议的开源代码作为它的类库和二次开发的基础。因为私有软件开发者使用了GPL库就必须公开自己的源码,自己所开发软件也要免费,这些可能都是商业软件无法接受的条件。
但是对于自由软件开发者来讲,大多数情况下采用GPL的优势比较大,自由软件开发者联合起来借着这个机会相互之间利用各自的优势不断发展壮大。当然自由软件开发也并不是所有情况都采用GPL就更好。你的库不是特殊和无法取代的库,很容易就能被私有软件以其他可替代库来实现。如果库不能给予自由软件任何特别的优势,最好还是以LGPL发布该库,GNUC库(glibc)选择了LGPL就是因为这个原因。如果我们使用GPL发布该库,将迫使私有软件开发者不得不使用其他的库,那我们的函数库的存在意义就会打了一个大大的折扣。
另外,现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们常见的开源协议如GPL、LGPL、BSD、Apache License2.0以及MIT等都是OSI批准的协议。做开源项目的时候,我们需要弄清楚这些软件引用的协议,我们自己的软件采用哪种开源协议比较好,然后选择和决定使用哪个开源软件。

f

Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式的更多相关文章

  1. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  2. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  3. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...

  4. Linux就这个范儿 第9章 特种文件系统

    Linux就这个范儿 第9章 特种文件系统 http://book.douban.com/reading/32081222/ P326 有一种文件系统,根本不在磁盘上.这种文件系统就是大名顶顶的ram ...

  5. Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称

    Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...

  6. Linux就这个范儿 第14章 身在江湖

    Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...

  7. Linux就这个范儿 第13章 打通任督二脉

    Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...

  8. Linux就这个范儿 第12章 一个网络一个世界

    Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus  OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...

  9. Linux就这个范儿 第11章 独霸网络的蜘蛛神功

    Linux就这个范儿 第11章  独霸网络的蜘蛛神功  第11章 应用层 (Application):网络服务与最终用户的一个接口.协议有:HTTP FTP TFTP SMTP SNMP DNS表示层 ...

随机推荐

  1. 图解classloader加载class的流程及自定义ClassLoader

    图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** *  转载请注明作者longdick    http://l ...

  2. OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化

    OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...

  3. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  4. 前端编码风格规范(3)—— JavaScript 规范

    JavaScript 规范 全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这 ...

  5. php处理数组函数大全

    PHP:指示支持该函数的最早的 PHP 版本. 函数 描述 PHP array() 创建数组. 3 array_change_key_case() 返回其键均为大写或小写的数组. 4 array_ch ...

  6. CruiseControl.Net学习记录

    一.下载 官网 二.安装 本文版本:1.8.5.0 运行安装程序,按照提示"下一步”,直到完成即可. 安装完毕之后, 生成一个windows服务,CruiseControl.NET Serv ...

  7. Cent OS 6.6 下安装mysql(5.5.20)和 PHP(5.3.10)

    0.准备步骤(没有连接网络的 linux): 挂载光盘.让网络 yum 源失效.修改光盘 yum 文件.安装 c 语言编译器 gcc. 1.MySQL(5.5.20) 下载 mysql 5.5.20 ...

  8. 归纳整理 PHP大神的十大优良习惯

    2015年03月04日11:26 来源:程序师 作者:TECHUG 编辑:覃里 查看全文 赞(0)评论(0) 分享 标签: PHP , 编程指南 , PHP开源项目 [IT168 资讯] 1.多阅读手 ...

  9. PHP 用QueryList抓取网页内容

    http://www.cnblogs.com/wb145230/p/4716403.html 之前抓取网页数据都是用Java Jsoup,前几天听说用PHP抓更方便,今天就简单研究了一下,主要是用Qu ...

  10. Git 忽略一些文件不加入版本控制

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a    ...