十三.进程间通讯(IPC机制)——管道
1.进程间通讯方式
管道,信号量,共享内存,消息队列,套接字。
2.管道的概念
只能以只读只写管道。
管道文件:创建好内存中分配。(目的:进程间通讯)
3.有名管道
3.1 创建有名管道
命令 mkfifo 管道名
3.2 运行有名管道
创建a.c,只读文件
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fdw = open("FIFO",0_WRONLY);
if(fdw == -1) exit(1);
char buff[128] = {0};
while(1)
{
memset(buff,0,128);
printf("input:");
fgets(buff,128,stdin);
if(strncmp(buff,"end",3) == 0)
{
break;
}
write(fdw,buff,strlen(buff));
}
close(fdw);
exit(0);
}
创建b.c 只写
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fdr = open("FIFO" ,O_RDONLY);
if(fdr == -1) exit(1);
char buff[128] = {0};
while(1)
{
memset(buff,0,128);
int num = read(fdr,buff,128); if(num == 0) break;
printf("read = %s\n",buff);
}
close(fdr);
exit(0);
}
4.无名管道
可以用于父子进程间通信
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fd[2];
if(pipe(fd) == -1) exit(1);
pid_t pid = fork();
if(pid == -1) exit(1);
if(pid ==0)
{
close(fd[1]);
char buff[128] = {0};
read(fd[0],buff,127);
printf("%s\n",buff);
close(fd[0]);
}
else{
close(fd[0]);
write(fd[1],"hello",5);
close(fd[1]);
}
exit(0)
}
5.管道的特点
半双工:一端只能进行一件事,只读或只写
管道没有数据,read阻塞
管道的写端关闭,read返回0
管道读端关闭,写端产生异常(发送信号,SIGPIPE,程序收到信号 异常终止)