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