使用 rexec 时出现一个非常奇怪的错误。代码很简单,我只是循环调用rexec:
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
int main() {
  char buffData[1024];
  int i;
  ssize_t j;
  char * l_ahost = "cwp01";
  struct servent * l_servInfo = getservbyname("exec", "tcp");
  for (i = 0; i < 2000; i++) {
    int err = rexec(&l_ahost, l_servInfo->s_port, NULL, NULL, "echo -n .", NULL);
    if (err <= 0) {
      perror("Rexec error");
    } else {
      if (read(err, buffData, 1024) > 0) printf ("'%c' %d\n", *buffData, i);
      close(err);
    }
  }
  return 0;
}
输出是:
muftak : > gcc tst_rexec.c ; ./a.out
    '.' 0
    '.' 1
    '.' 2
    '.' 3
    '.' 4
    ...
    '.' 47
    '.' 48
    '.' 49
    cwp01.eurocontrol.fr: Connection reset by peer
    Rexec error: Illegal seek
    '.' 51
    '.' 52
    '.' 53
    '.' 54
    ...
为什么 rexec 几乎总是正常工作,但并非总是如此?对于这样一个简单的案例,非确定性行为让我很不安。我不知道在哪里可以搜索对此的解释(当然,stackoverflow 除外)。
我正在使用 Red Hat Enterprise Linux Server 版本 5.8 (Tikanga)