On 10/4/07, भरत लोिहया <[EMAIL PROTECTED]> wrote: > Hello all, > > I have a problem while writing a program in perl. > I am creating a process using Open3. Here goes the code. > ******** > use Symbol qw(gensym); > > my $RD=gensym(); > my $WR=gensym(); > my $ER=gensym(); > my $ERR_LOGS='Error_GDB_'.time(); > print STDOUT "$ERR_LOGS\n"; > open( $ER,">>$ERR_LOGS") || die "Unable to open error file $ERR_LOGS $!\n"; > > my $pid=open3($WR,$RD,$ER,$process) || die "$!\n"; <==== problem > ........(firing commands by writing on $WR and reading output from $RD, but > it should write the errors on $ERR_LOGS, as $ER is associated with it) > ********** > This is a small part of code I have written, the problem I am facing here is > that the function open3 is not writing the errors on the $ERR_LOGS file. But > while execution I can see " /proc/<pid>/fd/4", has the errors of the > process. > With this code, it gets stuck somewhere in the program execution, because of > not getting fd/4 flushed(in my opinion). To overcome that I tried replacing > $ER in Open3 statement with "STDERR" which subsequently flushes all errors > (and does not get stuck anywhere and run the whole process till the end > successfully, but no logging of errors), and hence I can not see any error > file descriptor associated with the process in /proc. > Since I want to capture the errors according to the requirement of the > project, I tried various other methods but nothing is running the full > program and capturing the process errors. > The other methods I tried are. > 1. open the ERR_LOGS file with another $PROC_ERR and passed this with open3 > instead of $ER. => got stuck and did not log the error in file. > 2. open the error file with $PROC_ERR and passed $ER with open3, and reading > from $ER as I read $RD with the help of "sysread function". But it get stuck > when it first encounters reading $ER. > etc. >
Try capturing the STDERR into the temp file and calling them , kinda of use IO::File; local *CATCHERR = IO::File->new_tmpfile; my $pid=open3($WR,$RD, ">&CATCHERR" , $process) || die "$!\n"; Well IMHO capturing the STDERR directly should work Thanks and Regards Gaurav Mishra -- Linux User #348873 ILUGD General Secretary, GZLUG Moderator RKGIT Alumni(Guiding Light) Software Engineer , UnitedVillages http://gauravmishra.info/blog "When i can run , i will run , When i can walk , i will walk, When i can crawl , i will crawl. But i will not stop moving forward"
-- ______________________________________________________________________ Pune GNU/Linux Users Group Mailing List: ([email protected]) List Information: http://plug.org.in/cgi-bin/mailman/listinfo/plug-mail Send 'help' to [EMAIL PROTECTED] for mailing instructions.
