免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1554 | 回复: 4
打印 上一主题 下一主题

关于管道的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-18 11:43 |只看该作者 |倒序浏览
请问使用pipe()传输文件内容时,管道最大支持多大长度的内容?什么情况下才会发生死锁的情况?谢谢!

论坛徽章:
0
2 [报告]
发表于 2006-10-18 11:49 |只看该作者
原帖由 chinaseen 于 2006-10-18 11:43 发表
请问使用pipe()传输文件内容时,管道最大支持多大长度的内容?什么情况下才会发生死锁的情况?谢谢!


取决于IO buffer吧?与pipe自身没有关系。
每次传4096字节是没问题的。一边写一边读,传多少文件都可以了。

论坛徽章:
0
3 [报告]
发表于 2006-10-18 13:19 |只看该作者
举个例子,进程1发给进程2数据后,进程1等待进程2的回复,不过由于pipe底下用的是stdio, 进程1发的数据缓冲住了,进程2一直没有收到,这样死锁就产生了。

论坛徽章:
0
4 [报告]
发表于 2006-10-18 14:06 |只看该作者
我将文件句柄的$|置为1了。我用子进程打开一个文件句柄读取一个大小为499K的文件,用父进程打开另一个句柄将内容输出至标准输出上,没有发生中断。程序如下:
pipe(READER,WRITER) || die "can't open pipe(): $!\n";

my $child = fork();
die "can't fork: $!\n" unless defined $child;

if($child == 0)
{
        close READER;
        select WRITER;
        $| = 1;
        open FILE,"/tmp/Report.csv" or die "can't open(): $!\n";

        my $len = 0;

        while(<FILE>)
        {
                print $_;
                chomp;
                $len += length($_);
        }

        print "\n\nthere are $len bytes";
        close FILE;
        exit 0;
}
else
{
        close WRITER;
        print while(<READER>);
        
}

这样就应该没有问题吧,属于一边写一边读吗吧,不会发生死锁吧!是不是每读后一次就将管道中的内容清空,释放管道中的空间?

论坛徽章:
0
5 [报告]
发表于 2006-10-18 14:14 |只看该作者
这样没有问题啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP