进程间通信

1.进程间通信的几种手段:
    (1).管道
        数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道),如果要建立全双工通信,需要建立两个管道
        只能用于父子,兄弟(有亲缘关系的进程)间通信
    (2).有名管道
        (named pipe ,FIFO)克服了管道的限制,可用于无亲缘关系的进程通信
        有名管道是一个设备文件
        FIFO原则,第一个被写入的数据,第一个被读出
    (3).信号量
        一个计数器,常用于进程和线程间同步问题,特别对临界资源的访问
        临界资源可以理解为某时刻只能由一个线程或者进程访问的资源
        信号量大于或者等于0可供并发使用的资源实体数,小于0代表正在等待使用临界资源的进程数
    (4).消息队列
        存放内核的一个消息列表,由消息列队标识符标识,只有内核重启或者显示删除一个队列,消息列队才会被真正删除。
        消息列队用到一些数据结构:
            消息缓冲结构
            mspid_ds内核数据结构
            ipc_perm内核数据结构
    (5).信号
    (6).共享内存
        共享内存就是分配一块能被其他进程访问的内存。每个共享内存段在内核中维护着一个内部结构shmid_ds(和消息队列和信号量一样)    
    (7).套接字
        
        
2.库的创建和使用
    Windows系统本身提供并使用了大量的库,包括静态链接库(lib文件),动态链接库(dll文件)
    类似:linux也使用库,Linux下通常把库文件存放在/usr/lib或者/lib下
    Linux库文件由前缀lib,库名和后缀组成。
    动态库以.so作为后缀,静态库以.a作为后缀
    程序中使用静态链接库和动态链接库时,他们的载入顺序不一样。
    静态库的代码在编译时就拷贝到应用程序中,当多个程序调用一个静态链接库时,内存中会有多个函数的副本。优点:节省编译时间。
    动态库在程序开始运行后调用函数库时才被载入,被调函数在内存中只有一个副本。并且动态库可在程序运行期间释放动态库占用的内存。
        从编写库函数,编译生成库文件,调用库函数3方面介绍静态,动态库:
        1.静态库的创建和使用:
            (1).在一个头文件中声明静态库所导出的函数
            (2).在一个源文件中实现静态库所导出的函数
            (3).编译源文件,生成可执行代码
            (4).将可执行代码所在的目标文件加入到某静态库中,并将静态库存放在系统默认的存放库文件的目录下。
  编译生成目标文件:gcc -o mylib.o -c mylib.c

将目标文件加入到静态库中,ar rcs libmylib.a mylib.o 
            将静态库拷贝到Linux库目录(usr/lib或/lib)
            
            用到静态库编译程序:gcc -o test test.c -lmylib
        2.动态链接库的创建和使用:
  gcc -fPIC -o mylib.o -c mylib.c

gcc -shared -o libttt.so mylib.o 
            
            合并成一条
  gcc -fPIC -shared -o libttt.so mylib.c 
            
用动态链接库编译自己程序:
  gcc -o main main.c ./libmylib.so

或者

cp libttt.so /usr/lib/libttt.so

gcc -o test test.c /usr/lib/libttt.so 
            使用动态链接库时必须含有路径,如果只用 libttt.so则必须确保这个库在环境变量路径中
            
            方法二调用动态链接库:
            调用linux系统函数实现
             dlopen ,dlsym , dlclose ,dlerror
            
            
            下一步学习书籍:Unix环境高级编程 ,Solaris系统编程,深入理解Linux内核

Linux C 程序 进程间通信(20)的更多相关文章

  1. linux应用程序开发-文件编程-系统调用方式

    在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...

  2. Linux C++程序进行性能分析工具gprof使用入门

    性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...

  3. slickedit编译调试linux应用程序

    目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...

  4. 批量远程执行linux服务器程序--基于paramiko(多线程版)

    批量远程执行linux服务器程序--基于paramiko paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 具体安装方法这里不写,网 ...

  5. 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程

    前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...

  6. [转帖]加强Linux服务器安全的20项建议

    加强Linux服务器安全的20项建议 2017-10-19 22:15:01作者:Linux编辑稿源:系统极客 https://ywnz.com/linuxyffq/99.html 一般情况下用 Li ...

  7. 嵌入式linux应用程序移植方法总结

    嵌入式linux应用程序移植方法总结 前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟.江浩 ...

  8. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  9. Linux C程序内存空间

    linux下内存空间布置: 一个典型的Linux C程序内存空间由如下几部分组成: 代码段(.text).这里存放的是CPU要执行的指令.代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段 ...

随机推荐

  1. C中存储类、链接和内存管理

    在C语言中,有5种不同的存储类型,即存储类.在介绍存储类之前,需要首先简单介绍几个术语.如下: 作用域:描述程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用 ...

  2. 从零开始学JAVA(06)-WebService_Jersey_Restful

    由于项目上需要写一个简单的评价系统,像银行MM前面的那种非常满意.满意.不满意那种,结合一个安卓的APP一起使用.由于使用3G网页通讯,个人认为http这种方式更合适.曾经听在Delphi鸟窝群的白雪 ...

  3. Mosaic HDU 4819 二维线段树入门题

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  4. 日本电商Rakuten:最凶猛的国际扩张者

    这是普及社(puji-she)第五篇关于电商开放平台的文章,今天关注日本的Rakuten,它是一家综合性的企业,核心业务包括电子商务.旅游.信用 及支付.金融证券.新闻门户等.本文关注Rakuten的 ...

  5. ios 画圆环进度条

    #import <UIKit/UIKit.h> @interface SNCircleProgressView : UIView /** * 进度值0-1.0之间 */ @property ...

  6. 通过CAGradientLayer类实现色度差动画

    #import "ViewController.h" @interface ViewController () { CAGradientLayer *_gradientLayer; ...

  7. MVC3+Linq to sql 显示数据库中数据表的数据

    1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...

  8. Windows XP与Windows 7系统常见漏洞

    1.Windows XP系统常见漏洞 Windows XP系统常见的漏洞有UPNP服务漏洞.升级程序漏洞.帮助和支持中心漏洞.压缩文件夹漏洞.服务拒绝漏洞.Windows Media Player漏洞 ...

  9. ubtntu怎么安装myeclipse

    1.下载jdk.tar.gz文件 2.解压jdk 命令:$sudo tar zxvf ./jdk.tar.gz 3.将解压后的jdk放在/usr/lib/jvm下 4.查看本机是否还有jiava可选 ...

  10. Sphinx 全文检索

    什么是全文检索: 全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术.检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容. 简介: Sphinx是由俄罗斯人And ...