摘要: 总结了Linux下进程通讯目的,通讯方式,IPC的概念,分析了管道和无名管道的使用方法,最后通过一个实例加深理解!
一、Linux进程通讯目的
Linux是一个多进程系统,各个进程之间会存在通讯的问题,通讯的目的有以下几种:
1.数据传输
一个进程需要将数据发送给另一个进程。
2.资源共享
多个进程可能会共享同一块内存上的数据。
3.通知事件
一个进程需要向别的进程发送消息,告诉他们发生了什么事件。
4.进程控制
有些进程希望控制其他进程的执行状态,例如DEBUG进程,此时该进程希望可以拦截其他进程的所有操作,并时刻知道它的状态。
其实说白了,上面的四个我认为都是一个道理,那就是进程之间的“数据传递”,无论是数据传输,资源共享,通知事件或者进程控制,他们之间都存在一个数据流的交互,只是模式不同,功能不同罢了。
二、IPC
IPC的扩展名是:interprocess communication,是由unix进程间通信,基于system V进程间通信和posix进程间通信发展而来。其,POSIX(Portable Operating SystemInterface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发 POSIX 标准,是为了提高UNIX 环境下应用程序的可移植性。许多其他的操作系统,例如windows也是支持posix的。
三、Linux进程间的通讯方式
主要有以下七种:
1.无名管道(pipe)
2.有名管道(FIFO)
3.消息队列(msg*)
4.共享内存(shm*)
5.信号量(sem*)
6.信号(signal)
7.套接字(socket)
四、管道通信及无名管道
一个进程在管道的写端写入数据,另一个进程在管道的读端读走数据,就像一根管道,一个人一边,写的人往里扔一个球,读的人在另一边拿走,读走了就没有了。
管道包括无名管道和有名管道,无名管道只能用于父子进程之间的通信,有名管道可以用于同一系统中任意两个进程之间的通信。
1.管道通讯是单向的,有固定的读端和写端。
2.数据被进程从管道读出后,在管道中该数据就不存在了。
3.当进程去读取空管道的时候,进程会阻塞。
4.当进程往满管道写入数据时,进程会阻塞。
5.管道容量为64KB(#define PIPE_BUFFERS 16
include/linux/pipe_fs_i.h)
6.在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,我们可以使用read,write,close方式来进行访问操作。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。
五、无名管道操作函数
1.创建管道
函数原型:int pipe(int pipefd[2])
函数作用:创建一个无名管道
头文件:include <unistd.h>
函数参数:pipefd[0]存放返回的管道读端的文件句柄,pipefd[1]存放返回的管道写端的文件句柄
返回值:
成功:返回管道两端的文件句柄存放在pipefd数组中,函数的返回0
失败:函数返回-1,pipefd中不会有文件句柄
2.关闭管道
写端close(pipefd[1]),读端close(pipefd[0])
3.读管道
read(pipefd[0],buf,count)
4.写管道
write(pipefd[1],buf.count)
<span style="font-size:18px;">例程:mypipe.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_tpid=0;
intpipefd[2];
charbuf1[20]={"this is buf1"};
charbuf2[20];
/*创建管道*/
if(pipe(pipefd)<0)
{
perror("creatpipe fault!\n");
exit(1);
}
/*创建子进程*/
pid=fork();
/*写管道*/
if(pid>0)
{
write(pipefd[1],buf1,20);
wait();
close(pipefd[1]);
exit(0);
}
/*读管道*/
else
{
read(pipefd[0],buf2,20);
printf("%s\n",buf2);
close(pipefd[0]);
exit(0);
}
return0;
}
运行结果为:
#this is buf1</span>
这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!