我将GNUtee修改为cycleteeSource Code(您可以从https://github.com/vls/cycletee/tree/master/bin下载二进制文件)
下面的例子可以解释它的作用:

seq 10 | cycletee 1.txt 2.txt 3.txt
cat 1.txt // prints 1, 4, 7, 10
cat 2.txt // prints 2, 5, 8
cat 3.txt // prints 3, 6, 9

然后有一个all.tgz(构建脚本见附录)
all.tgz有三个文本文件,共900万行。
一切都很好。比如:
seq 10000000 | ./cycletee 1.txt 2.txt 3.txt

zcat all.tgz | tee 1.txt > /dev/null

zcat all.tgz | tail // got 9000000 at the last line

除了打电话:
zcat all.tgz | ./cycletee 1.txt 2.txt 3.txt

当它读到300万行时,它就退出了。
我得到这个消息,它退出:
_llseek(2, 0, 0xffbec3d0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)

问题
有人能指出我的源代码的问题吗?
任何解决问题的调试技术都将受到赞赏。我不知道在这种情况下如何使用gdb
附录
all.tgz可以由这个Python sciprthttps://gist.github.com/1500742构建
环境:Ubuntu 10.04 32位,CentOS 5.4 64位

最佳答案

来源:

read:
    buffer[0] = '\0';
    ptr = fgets(buffer, (int) sizeof buffer, stdin);
    if(NULL == ptr) {
        if(ferror(stdin)) {
            error (0, errno, "%s", _("standard input"));
            ok = false;
        }
        flag_break = true;
        break;
    }
    bytes_read = strlen(buffer);


      if (bytes_read < 0 && errno == EINTR)
      {
          flag_continue = true;
          backup_i = i;
          break;
      }
      if (bytes_read <= 0) {
          flag_break = true;
          break;
      }

    if (descriptors[0]
            && fwrite(buffer, bytes_read, 1, descriptors[0]) != 1)
            {
                error (0, errno, "%s", files[0]);
                descriptors[0] = NULL;
                ok = false;
            }
 ...

我认为这对二进制输入(包含nul的输入)不起作用。
[鉴于字节读取的有符号性,我强烈怀疑fread()已被fgets()+strlen();]这可能是或可能不是管道错误的原因,但看起来非常错误。

关于c - 调用zcat all.tgz时,llseek返回ESPIPE | ./周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8573540/

10-10 04:27