进程间通信

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. SecureCRT 滚动条设置

    不久前在Debian下使用kermit时发现kermit有一些优点,比如当串口上不断有信息打印时,仍然可以通过拖动滚动条来查看以前打印的信息,并且滚动条不会滚动到最下面.当按下回车键时,滚动条会自动滚 ...

  2. Socket 之 同步以及异步通信

    用netstat侦听下端口状态 同步通信: 预定义结构体,同步通信没有多线程异步委托回调,所以无需预定义结构体 客户端Client: class Program { static void Main( ...

  3. Python笔记(二)

    在昨天学习Python之后,感觉它的的确确挺简洁,也挺容易学习.在昨天的学习中我们了解到了Python中while循环语句以及if...else语句的使用,while语句的使用格式是这样的:while ...

  4. WPF之基于路径的动画

    不是突然想到要做一个路径动画的,是今天谈业务需求的时候偶然谈到的, 一艘船从一个国家到另外一个国家,沿着一条固定的路线前进,就是一个简单的动画效果,以前貌似在书上看到过,所以自己也来做一个. 在网上搜 ...

  5. How to setup ELM327 Bluetooth WiFi for Android software Torque

    1.    Install OBDII 2.    Install Android Software Torque a)    Copy software to phone from CD b)   ...

  6. [数据结构]字典树(Tire树)

    概述: Trie是个简单但实用的数据结构,是一种树形结构,是一种哈希树的变种,相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符 ...

  7. apply和call的区别在哪里

    apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这 ...

  8. 剑指Offer15 合并两个已排序链表

    /************************************************************************* > File Name: 15_MergeT ...

  9. LeetCode 287

    Find the Duplicate Number Given an array nums containing n + 1 integers where each integer is betwee ...

  10. 初识 Asp.Net内置对象之Session对象

    Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...