进程通讯(二)--无名管道

 无名管道是父子进程间的通讯。无名的管道创建使用完全是在内存中。甚至连有名管道要创建的管道文件都没有。
   有名管道的管道文件虽然没有大小,但好歹磁盘中有个标记,可以被需通讯的进程们看到共同使用。而无名管道的管道完全隐藏在一个程序的代码中,在进程运行时创建销毁,正是因为这个特点,所以限制了通讯的范围。
   无名管道创建打开的函数 
   int pipe(int fd[2]);
   参数其实已经退化为指针了,之所以写2是为了明显的表示函数只需要自己定义的fd数组中的前两项。
   创建成功返回0,失败返回-1
  fd[0]控制读权限  
  fd[1]控制写权限
   read(fd[0],buff,size);
  写 write(fd[1],buff,len);
  关闭  close(fd[0])  close(fd[1])
   值得注意的是,进程通讯为了保证数据的安全完整读写,要求半双工,即父进程只写或只读,子进程对应相应的读或写,由于fork出的子进程和其父进程都拥有fd[0]和f[1],因此需要在fork后执行通讯前的第一件事是关闭其中一个权限f[0]或f[1]。
  纯文字还是不够直观,简单的举个栗子
  进程创建子进程,这俩个进程实现这样一种通讯,即父进程输入单词,子进程读单词,直到父进程输入了end,进程结束。
  进程通讯(二)--无名管道

进程通讯(二)--无名管道
可以看到在父子进程的if else 分别对应的代码块的第一句就是先关闭了非自己应有的权限。最后才是关闭了自己本身的权限。
进程通讯(二)--无名管道