进程间的通信方式 四种 进程间的几种通信方式

\u8fdb\u7a0b\u4e4b\u95f4\u6709\u54ea\u51e0\u79cd\u901a\u4fe1\u65b9\u5f0f\uff1f

# \u7ba1\u9053( pipe )\uff1a\u7ba1\u9053\u662f\u4e00\u79cd\u534a\u53cc\u5de5\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u6570\u636e\u53ea\u80fd\u5355\u5411\u6d41\u52a8\uff0c\u800c\u4e14\u53ea\u80fd\u5728\u5177\u6709\u4eb2\u7f18\u5173\u7cfb\u7684\u8fdb\u7a0b\u95f4\u4f7f\u7528\u3002\u8fdb\u7a0b\u7684\u4eb2\u7f18\u5173\u7cfb\u901a\u5e38\u662f\u6307\u7236\u5b50\u8fdb\u7a0b\u5173\u7cfb\u3002
# \u6709\u540d\u7ba1\u9053 (named pipe) \uff1a \u6709\u540d\u7ba1\u9053\u4e5f\u662f\u534a\u53cc\u5de5\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u4f46\u662f\u5b83\u5141\u8bb8\u65e0\u4eb2\u7f18\u5173\u7cfb\u8fdb\u7a0b\u95f4\u7684\u901a\u4fe1\u3002
# \u4fe1\u53f7\u91cf( semophore ) \uff1a \u4fe1\u53f7\u91cf\u662f\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u53ef\u4ee5\u7528\u6765\u63a7\u5236\u591a\u4e2a\u8fdb\u7a0b\u5bf9\u5171\u4eab\u8d44\u6e90\u7684\u8bbf\u95ee\u3002\u5b83\u5e38\u4f5c\u4e3a\u4e00\u79cd\u9501\u673a\u5236\uff0c\u9632\u6b62\u67d0\u8fdb\u7a0b\u6b63\u5728\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u65f6\uff0c\u5176\u4ed6\u8fdb\u7a0b\u4e5f\u8bbf\u95ee\u8be5\u8d44\u6e90\u3002\u56e0\u6b64\uff0c\u4e3b\u8981\u4f5c\u4e3a\u8fdb\u7a0b\u95f4\u4ee5\u53ca\u540c\u4e00\u8fdb\u7a0b\u5185\u4e0d\u540c\u7ebf\u7a0b\u4e4b\u95f4\u7684\u540c\u6b65\u624b\u6bb5\u3002
# \u6d88\u606f\u961f\u5217( message queue ) \uff1a \u6d88\u606f\u961f\u5217\u662f\u7531\u6d88\u606f\u7684\u94fe\u8868\uff0c\u5b58\u653e\u5728\u5185\u6838\u4e2d\u5e76\u7531\u6d88\u606f\u961f\u5217\u6807\u8bc6\u7b26\u6807\u8bc6\u3002\u6d88\u606f\u961f\u5217\u514b\u670d\u4e86\u4fe1\u53f7\u4f20\u9012\u4fe1\u606f\u5c11\u3001\u7ba1\u9053\u53ea\u80fd\u627f\u8f7d\u65e0\u683c\u5f0f\u5b57\u8282\u6d41\u4ee5\u53ca\u7f13\u51b2\u533a\u5927\u5c0f\u53d7\u9650\u7b49\u7f3a\u70b9\u3002
# \u4fe1\u53f7 ( sinal ) \uff1a \u4fe1\u53f7\u662f\u4e00\u79cd\u6bd4\u8f83\u590d\u6742\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u7528\u4e8e\u901a\u77e5\u63a5\u6536\u8fdb\u7a0b\u67d0\u4e2a\u4e8b\u4ef6\u5df2\u7ecf\u53d1\u751f\u3002
# \u5171\u4eab\u5185\u5b58( shared memory ) \uff1a\u5171\u4eab\u5185\u5b58\u5c31\u662f\u6620\u5c04\u4e00\u6bb5\u80fd\u88ab\u5176\u4ed6\u8fdb\u7a0b\u6240\u8bbf\u95ee\u7684\u5185\u5b58\uff0c\u8fd9\u6bb5\u5171\u4eab\u5185\u5b58\u7531\u4e00\u4e2a\u8fdb\u7a0b\u521b\u5efa\uff0c\u4f46\u591a\u4e2a\u8fdb\u7a0b\u90fd\u53ef\u4ee5\u8bbf\u95ee\u3002\u5171\u4eab\u5185\u5b58\u662f\u6700\u5feb\u7684 IPC \u65b9\u5f0f\uff0c\u5b83\u662f\u9488\u5bf9\u5176\u4ed6\u8fdb\u7a0b\u95f4\u901a\u4fe1\u65b9\u5f0f\u8fd0\u884c\u6548\u7387\u4f4e\u800c\u4e13\u95e8\u8bbe\u8ba1\u7684\u3002\u5b83\u5f80\u5f80\u4e0e\u5176\u4ed6\u901a\u4fe1\u673a\u5236\uff0c\u5982\u4fe1\u53f7\u4e24\uff0c\u914d\u5408\u4f7f\u7528\uff0c\u6765\u5b9e\u73b0\u8fdb\u7a0b\u95f4\u7684\u540c\u6b65\u548c\u901a\u4fe1\u3002
# \u5957\u63a5\u5b57( socket ) \uff1a \u5957\u89e3\u53e3\u4e5f\u662f\u4e00\u79cd\u8fdb\u7a0b\u95f4\u901a\u4fe1\u673a\u5236\uff0c\u4e0e\u5176\u4ed6\u901a\u4fe1\u673a\u5236\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u53ef\u7528\u4e8e\u4e0d\u540c\u53ca\u5176\u95f4\u7684\u8fdb\u7a0b\u901a\u4fe1\u3002 \u4ee5\u4e0a\u6765\u81ea\u767e\u5ea6

\u8fdb\u7a0b\u7684\u4eb2\u7f18\u5173\u7cfb\u901a\u5e38\u662f\u6307\u7236\u5b50\u8fdb\u7a0b\u5173\u7cfb\u3002
# \u6709\u540d\u7ba1\u9053 (named pipe) \uff1a \u6709\u540d\u7ba1\u9053\u4e5f\u662f\u534a\u53cc\u5de5\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u4f46\u662f\u5b83\u5141\u8bb8\u65e0\u4eb2\u7f18\u5173\u7cfb\u8fdb\u7a0b\u95f4\u7684\u901a\u4fe1\u3002
# \u4fe1\u53f7\u91cf( semophore ) \uff1a \u4fe1\u53f7\u91cf\u662f\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u53ef\u4ee5\u7528\u6765\u63a7\u5236\u591a\u4e2a\u8fdb\u7a0b\u5bf9\u5171\u4eab\u8d44\u6e90\u7684\u8bbf\u95ee\u3002\u5b83\u5e38\u4f5c\u4e3a\u4e00\u79cd\u9501\u673a\u5236\uff0c\u9632\u6b62\u67d0\u8fdb\u7a0b\u6b63\u5728\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u65f6\uff0c\u5176\u4ed6\u8fdb\u7a0b\u4e5f\u8bbf\u95ee\u8be5\u8d44\u6e90\u3002\u56e0\u6b64\uff0c\u4e3b\u8981\u4f5c\u4e3a\u8fdb\u7a0b\u95f4\u4ee5\u53ca\u540c\u4e00\u8fdb\u7a0b\u5185\u4e0d\u540c\u7ebf\u7a0b\u4e4b\u95f4\u7684\u540c\u6b65\u624b\u6bb5\u3002
# \u6d88\u606f\u961f\u5217( message queue ) \uff1a \u6d88\u606f\u961f\u5217\u662f\u7531\u6d88\u606f\u7684\u94fe\u8868\uff0c\u5b58\u653e\u5728\u5185\u6838\u4e2d\u5e76\u7531\u6d88\u606f\u961f\u5217\u6807\u8bc6\u7b26\u6807\u8bc6\u3002\u6d88\u606f\u961f\u5217\u514b\u670d\u4e86\u4fe1\u53f7\u4f20\u9012\u4fe1\u606f\u5c11\u3001\u7ba1\u9053\u53ea\u80fd\u627f\u8f7d\u65e0\u683c\u5f0f\u5b57\u8282\u6d41\u4ee5\u53ca\u7f13\u51b2\u533a\u5927\u5c0f\u53d7\u9650\u7b49\u7f3a\u70b9\u3002
# \u4fe1\u53f7 ( sinal ) \uff1a \u4fe1\u53f7\u662f\u4e00\u79cd\u6bd4\u8f83\u590d\u6742\u7684\u901a\u4fe1\u65b9\u5f0f\uff0c\u7528\u4e8e\u901a\u77e5\u63a5\u6536\u8fdb\u7a0b\u67d0\u4e2a\u4e8b\u4ef6\u5df2\u7ecf\u53d1\u751f\u3002
# \u5171\u4eab\u5185\u5b58( shared memory ) \uff1a\u5171\u4eab\u5185\u5b58\u5c31\u662f\u6620\u5c04\u4e00\u6bb5\u80fd\u88ab\u5176\u4ed6\u8fdb\u7a0b\u6240\u8bbf\u95ee\u7684\u5185\u5b58\uff0c\u8fd9\u6bb5\u5171\u4eab\u5185\u5b58\u7531\u4e00\u4e2a\u8fdb\u7a0b\u521b\u5efa\uff0c\u4f46\u591a\u4e2a\u8fdb\u7a0b\u90fd\u53ef\u4ee5\u8bbf\u95ee\u3002\u5171\u4eab\u5185\u5b58\u662f\u6700\u5feb\u7684 IPC \u65b9\u5f0f\uff0c\u5b83\u662f\u9488\u5bf9\u5176\u4ed6\u8fdb\u7a0b\u95f4\u901a\u4fe1\u65b9\u5f0f\u8fd0\u884c\u6548\u7387\u4f4e\u800c\u4e13\u95e8\u8bbe\u8ba1\u7684\u3002\u5b83\u5f80\u5f80\u4e0e\u5176\u4ed6\u901a\u4fe1\u673a\u5236\uff0c\u5982\u4fe1\u53f7\u4e24\uff0c\u914d\u5408\u4f7f\u7528\uff0c\u6765\u5b9e\u73b0\u8fdb\u7a0b\u95f4\u7684\u540c\u6b65\u548c\u901a\u4fe1\u3002
# \u5957\u63a5\u5b57( socket ) \uff1a \u5957\u89e3\u53e3\u4e5f\u662f\u4e00\u79cd\u8fdb\u7a0b\u95f4\u901a\u4fe1\u673a\u5236\uff0c\u4e0e\u5176\u4ed6\u901a\u4fe1\u673a\u5236\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u53ef\u7528\u4e8e\u4e0d\u540c\u53ca\u5176\u95f4\u7684\u8fdb\u7a0b\u901a\u4fe1\u3002

现在最常用的进程间通信的方式有:信号,信号量,消息队列,共享内存。

所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些massege。

他们的使用方法是基本相同的,所以只要掌握了一种的使用方法,然后记住其他的使用方法就可以了。

1. 信号
在我学习的内容中,主要接触了信号来实现同步的机制,据说信号也可以用来做其它的事情,但是我还不知道做什么。

信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P,V操作来实现的。

使用信号要先知道有哪些信号,在Linux下有31个需要记住的通用信号,据说也是systemV中最常用的那些。这里略。

1. 1信号相关函数:
#include
int sigaction(int signo, const struct sigaction *act, struct sigaction
*oact);
该函数用来为进程安装信号处理器,struct sigaction数据是用来保存信号处理器的相关信息。

#include
int sigemptyset(sigset_t *set);
将信号集合清空。
int sigfillset(sigset_t *set);
将信号集合设置成包含所有的信号。在对信号进行操作以前一定要对信号集进行初始化。

int sigaddset(sigset_t *set, int signo);
向信号集中加入signo对应的新信号。
int sigdelset(sigset_t *set, int signo);
从信号集中删除signo对应的一个信号。
int sigismember(const sigset_t *set, int signo);
判断某个信号是否在信号集中。返回1则在,0则不在。

#include
int sigprocmask(int how,const sigset_t *set, sigset_t *oset);用来设置进程的信号屏蔽码。信号屏蔽码可以用来在某段时间内阻塞一些信号集中的信号,如果信号不在信号集中,就不必讨论它,因为肯定不响应,是否能生成也不肯定,我没有做过试验。

1.2我所理解的使用信号机制的方法:
使用信号,主要做的事情就是信号处理器的工作,这里面是你想做的事情。就像中断处理函数一样。

在使用信号以前,首先要初始化信号集,只有在信号集里面的信号才会被考虑。

有两种方法可以初始化信号集,一种是设置空信号集,一种是将所有的信号都加到信号集中。如果你自己想要的信号集不是这两种,可以在初始化了以后通过添加和删除信号进行定制。

如果在进程执行的一段时间内不想对某些信号进行响应,则可以使用sigprocmask对当前的信号集中的一些信号进行阻塞,稍后再执行。

管道、邮槽、剪切板、共享内存、window消息机制

信号量 共享内存 消息队列 管道 socket

扩展阅读:进程间通信的5种方式 ... 线程间通信四个方法 ... 常见五种通信方式 ... 高级通信机制四种类型 ... 10个现代通信方式 ... plc常见的三种通讯方式 ... 四种常见的通信链路 ... 通讯有哪四种类型 ... 串口通信的四种方式 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网