进程间通信(无名、有名管道)

无名管道:

1)特点:

a.只能用于具有具有亲缘关系的进程间通信。

b.半双工通信方式,具有固定的读端和写端。

c.无名管道可以看作一种特殊的文件,用文件io对其进行读写。

d.管道是一种基于文件描述符的通信方式,当一个管道建立,默认打开文件描述符fd【0】读端,fd【1】写端。

2)函数:pipe

int fd[2];
if(pipe(fd)<0)
{
    perror("pipe err");
        return -1;
}

注意事项:

管道中无数据时读操作阻塞,且管道中无数据将写端关闭,读操作会立即返回。

管道中写满64k数据时写阻塞,读出4k空间写继续直至写满。

只有在管道读端存在时,写入才有意义,否则会发生管道破裂,向管道中写入数据的进程将会收到内核传来的SIGPIPE信号。

【2】有名管道:

1)特点:

a.可以用于两个互不相干的进程之间的通信。

b.有名管道可以通过路径名指出,在文件系统中可见,但内容存放在内存中。

c.通过文件IO进行操作。

d.有名管道遵循先入先出规则

e.不支持LSEEK操作

f.半双工通信

2)函数:mkfifo

int mkfifo(const char *filename,mode_t mode);
功能:创健有名管道
参数:filename:有名管道文件名
       mode:权限
返回值:成功:0
       失败:-1,并设置errno号
注意对错误的处理方式:
如果错误是file exist时,注意加判断,如:if(errno == EEXIST)

注意事项:

  1. 以只写方式打开,写阻塞,直到另一个进程将读打开

  2. 以只读方式打开,读阻塞,直到另一个进程将写打开

  3. 以可读可写方式打开,管道中无数据,读阻塞。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值