[ROOT] fgets oddity
From: masik@fzu.cz
Date: Tue Jul 17 2001 - 15:45:20 MEST
Hi,
has anybody seen a problem reading output of external commands by
fgets after popen (gSystem->OpenPipe) call? It can be noticed as a
garbage/empty line at the end of test/stress output where system info
is being obtained. I've seen this on Debian/PPC and some Debian/x86
(but not all machines fail). As for non-linux boxes I had a chance to
test only dxplus(OSF1) at CERN for which it is less frequent but it
happens too. Root version is 3.01/06, libc-2.2.3-6, Linux version
2.4.6-pre8, gcc-3.0.
Please see the following example
[dxplus02] /afs/cern.ch/user/j/jmasik/public > g++ -I$ROOTSYS/include
poproot2.cxx `root-config --libs`
[dxplus02] /afs/cern.ch/user/j/jmasik/public > ./a.out
fgets returned NULL
[dxplus02] /afs/cern.ch/user/j/jmasik/public > ./a.out
* OSF1 dxplus02 V4.0 1229 alpha
Any information on popen and fgets I have doesn't mention the need to
test anything beyond returned pointers. Bad runs have this line in
their tracelogs.
read(4, 0x30018000, 4096) = ? ERESTARTSYS (To be restarted)
Do you have an idea what's wrong? Everything works if I comment out
TSystem.h and remove `root-config --libs` from the compile command on
Debian/PPC, on OSF removing TSystem.h is enough.
Jiri
I don't know how to strace on OSF, on Linux it looks like
....
open("/data/masik/root-v3.02.gcc3/include/RQ_OBJECT.h", O_RDONLY) = 3
brk(0x103ae000) = 0x103ae000
fstat64(0x3, 0x7fffe938) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x30017000
read(3, "// @(#)root/base:$Name: $:$Id: "..., 4096) = 4096
_llseek(0x3, 0, 0, 0x7fffe8f8, 0) = 0
read(3, "// @(#)root/base:$Name: $:$Id: "..., 4096) = 4096
read(3, "ar *method) \\\n { Emit(\"Chan"..., 4096) = 152
read(3, "", 4096) = 0
pipe([4, 5]) = 0
fork() = 4880
close(5) = 0
fstat64(0x4, 0x7ffff0c8) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x30018000
read(4, 0x30018000, 4096) = ? ERESTARTSYS (To be
restarted)
--- SIGCHLD (Child exited) ---
fstat64(0x1, 0x7fffe9e8) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x30019000
ioctl(1, 0x402c7413, 0x7fffe848) = 0
write(1, "fgets returned NULL\n", 20) = 20
This archive was generated by hypermail 2b29
: Tue Jan 01 2002 - 17:50:52 MET