fifo不能按行读写

fifo不能按行读写

希望实现的功能:
后台启动一个ftp进程从fifo读取命令,前台将要下载的文件对应的get命令依次写到fifo

遇到的问题:
1)fifo的读写问题。read端总是得到write多次后串在一起的结果。
想到的可能的办法:write端每次write后调用flush(好像没有该函数?),read指定最大字节数(在哪里指定?)
#!/usr/bin/perl

$fifofile=(@ARGV)?(shift @ARGV):'NULL';

open FIFO,">$fifofile" or die "cannot open file $fifofile";

#Writing End
sub Writing {
        print "Enter a line:\n";
        while ( chomp($Line =<>)){
                $str1=$Line x 256;
#                print "str1=$str1\n";
                print FIFO $Line."XIXI"."\n";
                print "Enter a line:\n";
        }
}

#Reading End
sub Reading {
        while ( chomp($Line =<FIFO>)){
                print $Line."\n";
        }
}

#Main process

Writing;
#Reading;

close FIFO;
0. 这段测试代码貌似并不能很好的代表你的初衷.

1. 这段代码run下来没有问题吗难道?
   用同一个<FIFO>, 我这里结果总提示一些乱码.
   
2. Writing和Reading用不同的Handle之后, 想要及时flush的话:
use IO::Handel;
FOUT->autoflush(1);
或者
$| ### 这个貌似得和select连用
或者
$line = `tail -1 $fifofile`;

$| = 1;
谢谢,使用 $|=1后,前台每次输出可以及时被后台FTP获得了,参见代码如下:
##############fifow.pl
sub Writing {

        open CMDFILE,"< $home/cmds.list" or die "can not open cmd.list $!";
       
        select(FIFO);
        $| = 1;
        print FIFO "cd $remoteDir \n";
        print FIFO "lcd $home/$Source\n";        #~/source used to store downloaded files
       
         
        while ( chomp($Line =<CMDFILE>)){
                print FIFO $Line."\n";
                $result=0;
                if ($Line=~/mkdir/){
                        $result=1;
                } else {       
                        while (chomp($rel=<FIFO1>)){
                                if ($rel=~/File send OK/){
                                        $result=1;
                                        last;
                                }
                                if ($rel=~/Failed|Timeout/i){
                                        $result=0;
                                        last;
                                }
                                if ($rel=~/created/){        #mkdir OK
                                        $result=1;
                                        last;
                                }
                                if ($rel=~/Create directory operation failed|File exists/){        #mkdir KO
                                        $result=0;
                                        last;
                                }
       
                        }
                }
                print STDOUT "cmd=$Line\n";
                print STDOUT "result=$result\n";
        }
        print FIFO "quit\n";
       
        chdir $home;
        system("tar cvf $Source.tar $Source/.");
       
}



#Main process

#PrepareCmdFile;

$cmd="fifor.pl &";
system($cmd)==0 || die "can not system $cmd,$!";

$fifofile="$home/.fifo_m2c";
open FIFO,">$fifofile" or die "cannot open file $fifofile";
$fifofile="$home/.fifo_c2m";
open FIFO1,"<$fifofile" or die "cannot open file $fifofile";

Writing;

close FIFO;

#############fifor.pl
#!/usr/bin/perl

$fifofile="$home/.fifo_m2c";
open FIFO,"<$fifofile" or die "cannot open file $fifofile";
$fifofile="$home/.fifo_c2m";
open FIFO1,">$fifofile" or die "cannot open file $fifofile";

select(FIFO1);
$| = 1;

sub Reading {
        close STDIN;
        open STDIN,"<&FIFO";
        close STDERR;
        open STDERR,">&=STDOUT";
        close STDOUT;
        open STDOUT,">&FIFO1";
       
        $cmd = "ftp hostname ";
        exec($cmd)==0 or die "can not running $cmd,$!";
}

#Main process
Reading;

close FIFO;

执行命令的行:
$./fifow.pl remoteDir
说明:
1)在HOME目录下包含了.netrc文件,因此登陆过程就不用交互了;
2)还存在一个问题:前台不能捕获后台ftp每次执行完命令后输出的“ftp>"行,因此不能很好交互.

请教的问题是:如何将后台ftp输出的ftp>串也输出到fifo中,也就是在perl中如何达到 2>&1 的效果?