无名管道介绍,创建与使用
首先进程间通讯方式共有以下7种:
早期Unix进程间通信方式3种
1.无名管道(pipe)
2.有名管道(fifo)
3.信号(signal)
System V IPC,4种
4.共享内存(share memory)
5.消息队列(message queue)
6.信号灯集(semaphore set)
7.套接字
本次只介绍无名管道,后期会陆续记录所有通信方式
无名管道具有以下特点:
1.只能用于具有亲缘关系的进程之间的通讯(父子或兄弟进程)
2.弹弓的通信模式,具有固定的读端和写端
3.无名管道创建时会返回两个文件描述符,分别用于读写管道
无名管道创建–pipe
#include <unistd.h>
int pipe(int pfd[2]);
1.成功时返回0,失败时返回EOF
2.pfd包含两个元素的整型数组,用来保存文件描述符
3.pfd[0]用于读管道;pfd[1]用于写管道
读无名管道时:
1.写端存在:有数据则读取数据;无数据则阻塞
2.写端不存在:不可能有数据;无数据则立即返回
写无名管道时:
1.读端存在:有空间则写入成功;无空间则阻塞
2.读端不存在:管道破裂
代码示例
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int pfd[2];
pid_t pid;
int re;
re = pipe(pfd);
if (re == -1)
{
perror("pipe");
return -1;
}
pid = fork();
if (pid < 0)
{
perror("fork");
return -1;
}else if (pid == 0)
{
char buf[64] = "haha, I am child,pipe message!\n";
while (1)
{
write(pfd[1], buf, strlen(buf));
sleep(1);
}
}else
{
char buf[64];
while (1)
{
memset(buf, 0, 64);
re = read(pfd[0], buf, 64);
if (re > 0)
{
printf("msg from child %s\n", buf);
}else
{
break;
}
}
}
return 0;
}