进程间管道通信包括有名管道和无名管道两种;
首先我们介绍无名管道,无名管道特点:
1、只能用于具有亲缘关系的进程间进行通信。
2、通讯的两个进程之间是单工模式,即具有固定的读端和写端。
3、管道也可以看成是一种特殊的文件,对于管道的读写可以用普通的read()、write()函数,无名管道存在于内核的内存当中。
管道的创建方式:
#include <unistd.h>
int pipe(int fd[])函数,fd整形数组中包含两个数据,fd[0]读端,fd[1]写端,关闭的时候可以使用close()函数。
管道读写应当注意:
1、只有读端存在时,向管道内写数据才有意义,如果读端不存在向管道中写数据将会导致管道破裂。
2、向管道中写入数据是,linux并不保证原子性,管道缓冲区中只要有空间,写进程就会一直写,如果管道中没有空间之后,写进程就会阻塞。
3、因为读写进程的运行顺序并不能确定,应当采用sleep()函数或是同步互斥机制,保证读进程线先运行。
实例:
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define N 1024
int main(int argc, const char *argv[])
{
int pid;
int pipe_fd[2];
char buf[N] = "hello,world!";
char buff[N];
if ( pipe(pipe_fd) < 0 )
{
perror("fail to pipe");
exit(-1);
}
if ( (pid = fork()) == 0 )
{
close(pipe_fd[1]);
read(pipe_fd[0],buff,sizeof(buff));
printf("%s\n", buff);
exit(0);
}
else if( pid > 0 )
{
close(pipe_fd[0]);
write(pipe_fd[1], buf, strlen(buf));
close(pipe_fd[1]);
exit(0);
}
waitpid(pid, NULL, 0);
return 0;
}