tag 标签: 无名管道通讯

相关博文
  • 热度 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; }