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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值