进程间通信方式
传递数据的方式
1.pipe
必须是有亲缘关系的进程之间使用,平时用"ls | grep abc"等命令时用得就是这个,这个"|"我猜测是用了两种系统调用实现,一个是pipe(popen),一个是dup2,没有看过bash或sh的源码,只是猜测。
2.fifo
会在文件系统中产生一个管道文件。
3.socket
有一个unix域套接字,可用作进程间通信,但有说法posix消息队列的性能优于systemv消息队列,systemv消息队列性能优于unix域套接字。
4.posix 消息队列
写程序该选到systemv消息队列的时候,大部分可以用posix消息队列代替,因为他的性能更好。
5.systemv 消息队列
gcc下不用链接库就可以使用,posix的线程和消息队列分别需要链接pthread库和rt库
6.systemv 共享内存
传递数据方式更灵活。
同步方式
1.信号
2.systemv 信号量
不同于pthread信号量,它需要一个key,以在不同进程间标识每个信号量资源。
线程间通信方式
传递数据的可用方式
1.全局变量
2.堆内存
3.任何进程间可用的传递数据方式
同步方式
1.pthread 互斥锁
有自旋锁、读写锁、互斥锁三种类型
2.pthread 条件变量
与互斥锁一块可完成一个生产者与消费者的模型
3.pthread 信号量
可单独实现一个生产者和消费者的模型
4.任何进程间可用的同步方式
1、参考资料:精通Linux C编程 (虽然名子很山寨,但觉得这本书写得很全,作为资料查阅感觉许多时候,比APUE都强。网上也有人说这本书有很多错误,至少目前还没有见过一个我确定是错误的地方)
2、关于一个全局的int变量读写是不是需要加锁的问题。见过很多帖子讨论这个问题,但没有见过一个能信服的答案。自己用起来在一些比较简单的情况下x没有加锁,比如只有两个线程共用一个变量,一个线程只读,另一个线程只写。有人说,容易引起core dump,但至少我还没有见过这种情况。
3、写得不是很专业,很多地方没有经过特别多的求证,仅供参考。