使用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)。
我正在使用红帽企业Linux服务器版本5.8(Tikanga)
答案 0 :(得分:0)
我对TCP知之甚少,对rexec的了解甚少。你有没有尝试过命令版本?你的代码建议你可以使用rexec(1)而不是rexec(3)。
祝你好运。答案 1 :(得分:0)
首先,您应该阅读rexec的手册页,了解必须不能使用它的原因。
其次,“非决定论行为”在网络编程中非常普遍(并且它与本地编程有很大不同,并且为什么完全分布式系统甚至不知道代码是远程运行的原因很难实现)。从错误消息中,看起来服务器cwp01.eurocontrol.fr在测试期间只是重新启动。