当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 学习笔记 > 嵌入式学习笔记:进程间的通信方式总结

嵌入式学习笔记:进程间的通信方式总结 时间:2018-09-04      来源:未知

进程间的通信方式分为很多种,学习这个就要从这几方面来入手,不妨一看

【1】常见的进程间通信方式(7种)

【2】无名管道

【3】(FIFO)有名管道

【4】信号signal

【1】常见的进程间通信方式(7种)

1)传统的进程间通信方式

无名管道(pipe)

有名管道(fifo)

信号(signal)---- 异步通信

2)System V IPC (Inter-Process Communication)

消息队列(message queue)

共享内存(share memory)

信号灯集(semaphore)

3)BSD

套接字(socket)

【2】无名管道

1)简介:

在内核空间开辟一块区域,并向进程提供两个文件描述符fd[0],fd[1]; fd[0]:固定用于读管道

fd[1]:固定用于写管道

先进先出模式,消息被读取后则删除

在使用无名管道时,应创建无名管道,在使用fork()函数创建子进程;

2)特点:

1)只能用于具有亲缘关系的父子进程之间通信

2)半双工的通行模式,具有固定的读端和写断

3)管道可以看成时一种特殊文件,对于它的读写可以使用文件I/O(管道建立在内核空间,

必须使用文件IO进行访问)(不支持lseek函数)

4)读操作被阻塞:当管道中没有数据时

写操作被阻塞:管道被写满时(管道大小为64K);5)管道破裂:管道读端被关闭,再向管道中写入数据时,

即向管道写入数据的进程会收到来自内核发送的SIGPIPE信号6)数据存放于内存中,读取后就不存在了

3)使用步骤:

在对管道内的数据进行操作时,必须使用文件IO,在对用户空间的数据进行操作时,可以使用标准IO(择优选择);

【3】(FIFO)有名管道

1)简介

在内核开辟一块空间,用来存储数据,但是此空间通过存储在磁盘空间的文件名来操作;

先进先出模式,消息被读取后则删除

2)特点

1)可以使互不相关的两个进程互相通信,有名管道可以通过路径名来指出,并且在文件系统中可见

2)进程通过文件IO来操作有名管道,内容存放在内存中

3)不支持lseek()操作

4)其它与无名管道一样。

5)读操作被阻塞:当管道中没有数据时

写操作被阻塞:管道被写满时(管道大小为64K);

6)有名管道在被创建后,显示大小为0(因为其存放在内存中)

7)有名管道文件在被单独打开时(无论读/写)都会阻塞,直到读端和写端都被打开时停止阻塞

3)有名管道的阻塞问题

由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。

对于O_RDONLY、 O_WRONLY、 O_NONBLOCK有4种组合方式:

1、open(const char *path,O_RDONLY)

在这种情况下,open 调用将阻塞,除非有一个进程以写方式打开同一个FIFO,否则它不会返回

2、open(const char *path,O_RDONLY|O_NONBLOCK )

即使没有其它进程以写方式打开FIFO,这open调 用也将成功并马上返回3、open(const char *path,O_WRONLY)

open调用将阻塞,直到有一个进程以读方式打开同一个 FIFO为止。

4、open(const char *path,O_WRONLY|O_NONBLOCK )

open调用总是立刻返回,便如果没有进程以读方式打开FIFO文件, open调用将返回一个错误(-1)并且FIFO也不会被打开。

对于读进程

• 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。

• 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。对于写进程

• 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。

• 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

4)使用步骤:

1)先在某一个进程中使用mkfifo()在内核空间中创建有名管道(在文件系统中

可见)

2)在需要使用有名管道的进程中通过 open()打开文件

3)使用文件IO对有名管道进行访问

5)相关函数

【4】信号signal

1)简介

信号是在软件层次上对中断机制的一种模拟,是唯一一种异步通信方式

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件

如果进程当前未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它

linux内核通过信号通知用户进程,不同的信号类型代表不同的事件

如果一个进程被设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程

用户进程对信号的响应方式:

忽略信号:对信号不做任何处理,但是有两个信号不能被忽略:SIGKILL和SIGSTOP捕捉信号:定义函数处理信号,当信号发生时,自行相应的处理函数执行缺省操作:Linux对每种信号都规定了默认操作

kill -l 34(SIGRTMIN)-64(SIGRTMAX) 可靠信号 信号可以被内核保存万次 而其他信号只会被保存一次,如果程序处于暂停态,且需多次接受相同信号,内核相同的信号只会发送一次给程序。

kill [-signal] pid 默认发送SIGTERM(15)终止进程 -signal指定信号 pid指定发送对

killall [-u user | prog] prog指定进程号 user指定用户名








上一篇:嵌入式学习笔记:c语言结构体学习方法

下一篇:嵌入式学习笔记:C++继承的三种方式,用实例教会你

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部