效果: 验证 写端全部关闭,读端输出
例如:
#include<stdio.h>
#inc;ude<ubistd.h>
int main()
{
int fd[2];
pipe(fd);
pid_t pid =fork();
if(pid == 0)
{
//子
sleep(3);
close(fd[0])//关闭读端
write(fd[1],"hello",5);
close(fd[1]);//关闭写端
whike(1)
{
sleep(1);
}
}
else if(pid>0)
{
close(fd[1]);
chr buf[12]={0};
int ret=read(fd[0],buf,sizeof(buf));
while(1)
{
if(ret==0)
{
printf("read over");
break;
}
if(ret>0)
{
write(STDOUT_FILENO,buf,ret)//打印到屏幕
}
}
}
}
输出:
hello read over
效果:读端全部关闭,写端输出
#include<stdio.h>
#inc;ude<ubistd.h>
#include<>
int main()
{
int fd[2];
pipe(fd);
pid_t pid =fork();
if(pid == 0)
{
//子
sleep(3);
close(fd[0])//关闭读端
write(fd[1],"hello",5);
close(fd[1]);//关闭写端
whike(1)
{
sleep(1);
}
}
else if(pid>0)
{
close[fd[0]];//关闭读端
close[fd[1]];//关闭写端
int status;
wait(&status);
if(WIFSIGNALED(statues))
{
printf("kill by %d\n",WIERMSIG(status));
}
while(1)父进程 关闭读写两端,但是不退出
{
sleep(1);
}
chr buf[12]={0};
int ret=read(fd[0],buf,sizeof(buf));
while(1) //
{
sleep(1);
}
if(ret==0)
{
printf("read over");
break;
}
if(ret>0)
{
write(STDOUT_FILENO,buf,ret)//打印到屏幕
}
}
}
}
输出: 异常
子进程成为僵尸进程,这是因为子进程读端关闭,在进行写操作,,程序会 产生异常终止
解决方式;父进程调用wait函数
输出: kill by SIGPIPE
也就是说写管道 读端关闭,会产生一个 SIGPIPE信号,程序终止
利用ulimate -la查看管道资源
pipe :512字节*8
计算管道大小 512*8 ulimate -a
long fpathconf(int fd,int name);