2013-06-17 1 views
1

rexec를 사용할 때 매우 이상한 오류가 발생합니다. 코드는 매우 간단합니다, 그냥 루프에서 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 제외). 내가 레드햇 엔터프라이즈 리눅스 서버를 사용하고

는 해제 5.8 (Tikanga)

답변

0

내가 그 TCP에 대해 많은 및 REXEC에 대한 더 적은을 모른다. 명령 버전을 아직 사용해 보지 않으셨습니까? 귀하의 코드는 rexec (3)와는 반대로 rexec (1)을 사용할 수 있다고 제안합니다.

행운을 비네.

+0

명령 줄에서 동일한 결과가 나타납니다. perl -e 'foreach $ i (0..1999) {$ a ='rexec -a cwp01 echo -n .'; "$ a $ i \ n" } ' ... . 1776 cwp01.eurocontrol.fr : 피어 REXEC에 의해 연결 재설정 : REXEC 시스템 호출 오류, REXEC :에서 읽기 오류 : REXEC을 추구 불법 : REXEC (다음 시스템 오류 자체가 오류가있을 수 있습니다) 원격 호스트 : 피어에 의한 연결 재설정 . 1778 ... – BOC

0

먼저, rexec의 man 페이지에서 으로 사용하지 않아야하는지 확인해야합니다.

두 번째로 "비 결정적 행동"은 네트워크 프로그래밍에서 매우 일반적입니다 (로컬 프로그래밍과 큰 차이가 있습니다. 코드가 원격으로 실행되는 것을 모르는 완전히 분산 된 시스템이 매우 어렵습니다) 달성하기 위해). 오류 메시지에서 cwp01.eurocontrol.fr 서버가 테스트 중 재부팅 된 것처럼 보입니다.

+0

나는 첫 번째 요점에 완전히 동의하며, 나는 rexec 사용을 중단 할 것을 촉구했다. 나는 복잡한 시스템에 대한 비 결정 론자의 행동을 이해하지만 이것이 사실이 아니며 재부팅이 필요 없다. 문제는 여기에서 재현하기가 매우 쉽습니다. – BOC

+0

"재현하기 쉽다"와 "비 결정 론적 행동"(자신의 말)은 모순적입니다. 49 번째 반복에서 항상 실패하면 결정적입니다. – bortzmeyer

관련 문제