Linux C 程序 进程间通信(20)

进程间通信

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).将可执行代码所在的目标文件加入到某静态库中,并将静态库存放在系统默认的存放库文件的目录下。
 1 编译生成目标文件:gcc -o mylib.o -c mylib.c

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

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

2 或者

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

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

















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。