( NevemTeve | 2014. 09. 04., cs – 20:32 )

Na, egynapos szenvedés árán rájöttem, hogy ezt a parancsot kellene kivizsgálni, miért esik végetlen ciklusba:


/usr/local/src/cmake-3.0.1/Bootstrap.cmk/cmake \
  /usr/local/src/cmake-3.0.1 \
  -C/usr/local/src/cmake-3.0.1/Bootstrap.cmk\
  /InitialCacheFlags.cmake\
  -G"Unix Makefiles"\
  -DCMAKE_BOOTSTRAP=1\
  -DCMAKE_VERBOSE_MAKEFILE=1\
  -DCMAKE_USE_SYSTEM_LIBRARY_CURL=1\
  -DCMAKE_USE_SYSTEM_LIBRARY_EXPAT=1\
  -DCMAKE_USE_SYSTEM_LIBRARY_ZLIB=1\
  -DCMAKE_USE_SYSTEM_LIBRARY_BZIP2=1

(a gond az volt, hogy a logban úgy látszott, hogy -GUnix Makefile van a parancsban, tehát szétesett a parancs...

truss szerint ilyesmi a vége:

6422708: 24445123: kopen("/usr/local/src/cmake-3.0.1/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx.tmp", O_RDONLY|O_LARGEFILE) = 3
6422708: 24445123: kioctl(3, 22528, 0x00000000, 0x00000000) Err#25 ENOTTY
6422708: 24445123: unlink("/usr/local/src/cmake-3.0.1/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx") = 0
6422708: 24445123: kopen("/usr/local/src/cmake-3.0.1/CMakeFiles/CMakeTmp/CheckIncludeFile.cxx", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) = 4
6422708: 24445123: kioctl(4, 22528, 0x00000000, 0x00000000) Err#25 ENOTTY
6422708: 24445123: kread(3, " # i n c l u d e   < i o".., 4096) = 48
6422708: 24445123: kread(3, "   w a r n i n g ,   i f".., 4048) = 0

Vagyis mintha az end-of-file már egy túl bonyolult jelenség lenne, amit csak végtelen ciklussal lehet elviselhetővé tenni...

Ilyesmit ír a gdb utolsó erejével:


2137      while(fin)
2138        {
2139        fin.read(buffer, bufferSize);
2140        if(fin.gcount())
2141          {
2142          fout.write(buffer, fin.gcount());
2143          }
2144        }

Namostan ez tényleg lehet egy file-másolás, de vajon mi a gond?
Mondjuk egy kicsit korábban egy érdekes komment van:


  // This copy loop is very sensitive on certain platforms with
  // slightly broken stream libraries (like HPUX).  Normally, it is
  // incorrect to not check the error condition on the fin.read()
  // before using the data, but the fin.gcount() will be zero if an
  // error occurred.  Therefore, the loop should be safe everywhere.

(Off: kb 25 éve mondogatom, hogy a C++ egyelőre kiforratlan, experimentális termék, komoly munkára ne használjuk, de figyel rám valaki?! Naná, hogy nem.)