热度 21
2015-3-7 16:30
1089 次阅读|
0 个评论
进程间通讯: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 ); 5.1.3 函数功能 创建进程间通信的无名管道 5.1.4 所属头文件 5.1.5 返回值 成功:返回0 失败:返回-1 5.1.6 参数说明 pipefd :读端fd pipefd :写端fd 在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。因此可以使用read,write,close等函数来访问无名管道。 小实验:无名管道通讯中,从子进程写数据,父进程中读数据。 #include #include int main() { pid_t pd; int pipefd ; char buf ; pipe(pipefd); pd = fork(); if(pd0) { wait(NULL); read(pipefd , buf, 12); printf("%s\n", buf); printf("This is father process!\n"); close(pipefd ); exit(0); } else { write(pipefd , "Hello Pipe!", 12); printf("This is child process!\n"); close(pipefd ); exit(0); } return 0; }