进程间通讯:Linux作为一个多进程的操作系统,进程和进程之间是否也需要通讯呢?答案是必须需要通讯。那么,通讯的目的是什么呢?
-
数据传输:一个进程需要将数据发送给另一个进程
-
资源共享:多个进程之间共享同样的资源
-
通知事件:一个进程需要向另一个/组进程发送消息,通知它们发生了某事件
-
进程控制:有些进程希望完全能够控制另一个进程的执行(如debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的改变。
进程间通讯的发展:Linux进程间通讯(IPC:interprocess communication )由以下几部分发展而来:
-
UNIX进程间通信
-
基于System V进程间通信
-
posix进程间通信
posix(portable operating system interface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发posix标准,是为了提高UNIX环境下应用程序的可移植性。然而,posix并不局限于UNIX,许多其他的操作系统,liruwindows都支持posix标准。
Linux进程间通讯的主要方式有:
-
无名管道(pipe)
-
有名管道(FIFO)
-
信号(signal)
-
消息队列
-
共享内存
-
信号量
-
套接字(socket)
管道通信:一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程之间的通信。
管道通信---特点:
-
管道通讯是单向的,有固定的读端和写端。
-
数据被进程从管道读出后,在管道中该数据就不存在了。
-
当进程去读取空管道的时候,进程会阻塞。
-
当进程往满管道写入数据时,进程会阻塞。
-
管道容量为64kb(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h)
无名管道:在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视为一个文件;无名管道的写端也被视为一个文件。
5.1 创建无名管道
5.1.1 函数名 pipe
5.1.2 函数原形 int pipe(int pipefd[2]);
5.1.3 函数功能 创建进程间通信的无名管道
5.1.4 所属头文件
5.1.5 返回值 成功:返回0 失败:返回-1
5.1.6 参数说明 pipefd[0]:读端fd pipefd[1]:写端fd
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。因此可以使用read,write,close等函数来访问无名管道。
小实验:无名管道通讯中,从子进程写数据,父进程中读数据。
#include
#include
int main()
{
pid_t pd;
int pipefd[2];
char buf[15];
pipe(pipefd);
pd = fork();
if(pd>0)
{
wait(NULL);
read(pipefd[0], buf, 12);
printf("%s\n", buf);
printf("This is father process!\n");
close(pipefd[0]);
exit(0);
}
else
{
write(pipefd[1], "Hello Pipe!", 12);
printf("This is child process!\n");
close(pipefd[1]);
exit(0);
}
return 0;
}
文章评论(0条评论)
登录后参与讨论