linux进程间通信之无名管道通信学习笔记

进程间管道通信包括有名管道和无名管道两种;

首先我们介绍无名管道,无名管道特点:

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;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页