Pipe(无名管道):
Pipe(无名管道)用于有缘进程间通信,父子进程或兄弟进程,调用pipe函数创建Pipe(无名管道),返回值为0,即成功,小于0,则失败,其传出参数为含有两个元素的数组,F[0]是管道的读端,F[1]是管道的写端,当父进程创建了子进程,子进程也会继承父进程的文件描述表,从而也指向同一文件表。
进程A和进程B可以是父子进程,亦可是兄弟进程
关闭未使用的文件描述符:
1 .当进程A为读,进程B为写的时候:
关闭进程A的写文件描述符4和进程B的读文件描述符3
2 .当进程A为写,进程B为读的时候:
关闭进程A的读文件描述符3,和进程B的写文件描述符4
下图为上述的第一种情况:
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int F[2]; //F[0]:read F[1]:writepid_t pid;char buf[1024];if(pipe(F)<0) exit(1);pid = fork(); //创建子进程if(pid>0) {
close(F[0]);printf("进程A:")scanf("%s",buf);write(F[1],buf,1024);wait(NULL); //等待子进程退出}else if(pid==0) {
close(F[1]);read(F[0],buf,1024);printf("进程B:%s\n",buf);}return 0;
}
父子进程间通信:
特殊点:
1 .读取进程未关闭写端,写入进程写完后,读取进程读完写入进程的数据后,依然还会阻塞,因为读入进程以为还有进程要写入。
2 .写入进程未关闭读端,其他进程已全部关闭读端,写入进程依旧能写入数据,直到写满管道,再写入的话,进程就会阻塞,直到管道有数据读出,才能解除阻塞。
3 .管道的读端计数为0(没有任何一个进程的文件描述符指向读端),当一个进程试图写入数据,内核将发送SIGPIPE信号,则会杀死该进程。(若SIGPIPE信号被捕获或忽略,则write函数会返回EPIPE错误)
4 . 管道的写端计数为0(没有任何一个进程的文件描述符指向写端),当一个进程试图读出数据,则读取进程就会像读完数据一样。