1

使用 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)

4

2 回答 2

0

首先,您应该阅读 rexec 的手册页以了解为什么不能使用它。

其次,“非确定性行为”在网络编程中很常见(这与本地编程有很大不同,这也是为什么你甚至不知道代码是远程运行的完全分布式系统很难实现的原因)。从错误消息来看,服务器 cwp01.eurocontrol.fr 在您的测试期间似乎只是重新启动。

于 2013-06-17T19:46:25.387 回答
0

我对 TCP 了解不多,对 rexec 的了解更少。您是否尝试过命令版本。您的代码建议您可以使用 rexec (1) 而不是 rexec (3)。

祝你好运。

于 2013-06-17T19:07:55.847 回答