进程通讯(二)--无名管道
无名管道是父子进程间的通讯。无名的管道创建使用完全是在内存中。甚至连有名管道要创建的管道文件都没有。

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

有名管道的管道文件虽然没有大小,但好歹磁盘中有个标记,可以被需通讯的进程们看到共同使用。而无名管道的管道完全隐藏在一个程序的代码中,在进程运行时创建销毁,正是因为这个特点,所以限制了通讯的范围。
无名管道创建打开的函数
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 分别对应的代码块的第一句就是先关闭了非自己应有的权限。最后才是关闭了自己本身的权限。