Linux进程间通信(实验十二)

一、管道
1.管道的逻辑结构如下:
在这里插入图片描述
2.在匿名管道中,写端对应的文件描述符为fd[1],读端的文件描述符为fd[0].所以负责写的进程要关闭fd[0](close(fd[0])),负责读的进程要关闭fd[1](close(fd[1]))

3.重定向函数dup2():函数声明为:int dup2(int oldfd,int newfd),其功能是将参数oldfd的文件描述符传递给newfd,若函数调用成功则返回newfd,否则返回-1并设置errno.

4.为了严谨起见,应使用close()函数关闭除通信端口之外的端口

5.若所有指向管道写端的文件描述符都被关闭后仍有进程从管道的读端读取数据,那么管道中所有剩余数据都被读取后,再次read会返回0.

6.管道中的数据以字节流的形式传输,这要求管道两端的进程事先约好数据的格式。

7.管道是一种最基本的进程间通信机制,其实质是由内核管理的一个缓冲区。Linux将管道视为一种文件。

8.管道通信的一般流程是:在一个进程中创建管道,通过fork()创建子进程,关闭管道多余端口,使父子进程与管道形成单向通道,进行数据传输。用popen()和pclose()两个函数即可完成管道通信的流程。

9.popen()函数
1)工作内容:调用pipe()创建管道,调用fork()函数创建子进程,随后在子进程中通过execve函数调用Shell命令执行相应功能。若整个流程都成功执行,则返回一个I/O文件指针;若执行失败,该函数会返回NULL。
2)声明及解析:FILE * popen(const char * command,const char * type)。command传入要执行的Shell命令;type指定命令类型(输入w/输出r)。若type设定为r,文件指针连接到command的标准输出,返回的文件指针是可读的;若type设定为w,文件指针连接到command的标准输入,返回的文件指针是可读的。
3)父进程与由popen创建出的进程之间的关系如图:
在这里插入图片描述
10.pclose函数的功能是关闭由popen打开的I/O流,并通过wait()函数等待子进程命令执行结束,返回Shell的终止状态,防止产生僵尸进程。调用popen后务必要使用pclose函数关闭打开的文件I/O指针,若pclose调用失败,则返回-1.

11.命名管道又称FIFO,它与匿名管道不同之处在于命名管道与系统中的一个路径名关联,以文件的形式存在于文件系统中。

12.创建FIFO文件:
1)使用命令创建FIFO示例:mkfifo -m 644 myfifo,这个命令创建了一个名为myfifo的FIFO文件,并将其权限设置为644
2)在程序中创建FIFO:

int mkfifo(const char * pathname,mode_t mode)    

参数1是路径名,参数2是权限

13.命名管道作为文件,它和普通文件的不同之处在于严格遵循先进先出原则。而且它和匿名管道一样,当缓冲区为空或缓冲区满时会阻塞。

二、消息队列
1.消息队列中的消息设定为不同类型,又被分配了不同的优先级,新添加的消息总是在队尾,但是接收消息的进程可以读取队列中间的数据。

2.消息队列降低了读写进程间的耦合强度,若接收消息的进程没有接收到消息,发生消息的进程无须等待,可继续发送消息。消息的读写双方只需要关注各自功能的实现情况即可。

3.消息队列独立于通信双方的进程之外,若没有删除内核中的消息队列,即便所有使用消息队列的进程都已经终止,消息队列仍存在于内核中,直到内核重新启动,管理命令被执行或调用系统接口删除消息队列时,消息队列才会被真正销毁。

4.宏的解释:
MSGMNI:限制系统中的最大消息队列数
MSGTOL:限制系统中的最大消息数
MSGMAX:限制消息队列中每个消息中所含数据块的长度
MSGMNB:限制队列中所含数据块的总长度

三、信号量
1.同一个系统中的多个进程之间可能因为进程合作或资源共享而产生制约关系。由于进程合作导致的制约关系称为直接相互制约关系,由于资源共享导致的制约关系称为间接相互制约关系。

四、共享内存
1.使用共享内存来实现进程间通信时,通信完成后应释放物理内存,解除进程与共享内存的映射关系
2.共享内存自身不限制进程对共享内存的读写次序,但程序开发人员应该自觉遵循读写规则,一般情况下,共享内存应与信号量一起使用,由信号量帮它实现读写操作的同步。

五、实验:
1.write函数把buf中nbyte写入文件描述符handle所指向的文档中,成功时返回写的字节数,错误时返回-1.

2.pipe函数创建一个匿名管道,头文件为unistd.h,创建成功则返回0,创建失败则返回-1.

3.read:从打开的设备或者文件中读取数据。成功则返回读取的字节数,出错则返回-1并设置errno。如果在调用read之前已经到达文件末尾,则这次read返回0.

4.同步与互斥的区别与联系:出处
1)互斥:指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的
2)同步:指在互斥的基础上,通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
3)总的来说,同步是同步是一种复杂的互斥,而互斥是一种特殊的同步,也就是说互斥是两个线程之间不可以同时运行,它们会互相排斥,必须等待一个线程运行完毕,另一个才能运行;而同步也是不能同时运行,但是它必须要以某种次序来运行相应的线程。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值