#include"stdio.h"
#include"unistd.h"
#include"stdlib.h"
int main()
{
int fd[2];
int ret;
ret=pipe(fd);
if(ret <0)
{
printf("创建管道失败\n");
return -1;//直接退出
}
printf("创建管道成功 fd[0]=%d,fd[1]%d\n",fd[0],fd[1]);//默认文件描述符是3个,0、1、2,新打开文件就是3,此处额外两个文件描述符就是3、4
return 0;
}
单个进程间通信的读写
#include"stdio.h"
#include"unistd.h"
#include"stdlib.h"
int main()
{
int fd[2];
int ret;
char writebuf[]="hello linux";//定义写函数写的内容的缓存
char readbuf[128]={0};
ret=pipe(fd);
if(ret <0)
{
printf("创建管道失败\n");
return -1;//直接退出
}
printf("创建管道成功 fd[0]=%d,fd[1]%d\n",fd[0],fd[1]);//默认文件描述符是3个,0、1、2,新打开文件就是3,此处额外两个文件描述符就是3、4
write(fd[1],writebuf,sizeof(writebuf));//写是fd[1]
//开始读
read(fd[0],readbuf,128);
printf("readbuf=%s\n",readbuf);
close(fd[0]);
close(fd[1]);
return 0;
}
验证读阻塞(管道中没有东西可读时会阻塞)
#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"stdlib.h"
int main()
{
int fd[2];
int ret;
char writebuf[]="hello linux";//定义写函数写的内容的缓存
char readbuf[128]={0};
ret=pipe(fd);
if(ret <0)
{
printf("创建管道失败\n");
return -1;//直接退出
}
printf("创建管道成功 fd[0]=%d,fd[1]%d\n",fd[0],fd[1]);//默认文件描述符是3个,0、1、2,新打开文件就是3,此处额外两个文件描述符就是3、4
write(fd[1],writebuf,sizeof(writebuf));//写是fd[1]
//开始读
read(fd[0],readbuf,128);
printf("readbuf=%s\n",readbuf);
//再读一次
memset(readbuf,0,128);//清除缓存内容
read (fd[0],readbuf,128);
printf("这条语句打印了就没有阻塞\n");
close(fd[0]);
close(fd[1]);
return 0;
}
没有读出来,所以阻塞了
用命令ps -axj查看进程号,发现在后台睡眠
检验当写入内容大于管道可存内容时会不会阻塞
#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"stdlib.h"
int main()
{
int fd[2];
int ret;
int i=0;
char writebuf[]="hello linux";//定义写函数写的内容的缓存
char readbuf[128]={0};
ret=pipe(fd);
if(ret <0)
{
printf("创建管道失败\n");
return -1;//直接退出
}
printf("创建管道成功 fd[0]=%d,fd[1]%d\n",fd[0],fd[1]);//默认文件描述符是3个,0、1、2,新打开文件就是3,此处额外两个文件描述符就是3、4
write(fd[1],writebuf,sizeof(writebuf));//写是fd[1]
while( i<5500)
{
write(fd[1],writebuf,sizeof(writebuf));
i++;
}
printf("写结束\n");//如果阻塞这句话不会打印
close(fd[0]);
close(fd[1]);
return 0;
}
没有打印,而且进程后台睡眠了,所以写满也会阻塞
父子进程的通信
#include"unistd.h"
#include"stdio.h"
#include"sys/types.h"
#include"stdlib.h"
int main()
{
pid_t pid;
int fd[2];
int ret;
char process_inter=0;
ret=pipe(fd);
if(ret <0)
{
printf("创建失败\n");
return -1;
}
printf("创建成功\n");
pid=fork();
if(pid==0)
{
int i=0;
//子进程读
read(fd[0],&process_inter,1);//如果子进程是空的,就会睡眠
while(process_inter==0)
for(i=0;i<5;i++)
{
printf("这是子进程 i=%d\n",i);
usleep(100);
}
}
if(pid >0)
{
int i=0;
for(i=0;i<5;i++)
{
printf("这是父进程 i=%d\n",i);
usleep(100);
}
process_inter=1;//父进程写
sleep(5);
write(fd[1],&process_inter,1);
}
while(1);
return 0;
}