2009-10-13 2 views
0

solaris의 fcntl의 Mannul에서 성공적으로 완료되면 F_SETLKW에 대해 반환 된 값은 "-1 이외의 값"이됩니다. 그러나 아파치 아파치 1.3.41 소스 코드 (http_main.c) 반환 값이 같은 긍정적 있는지 확인 : 매우 드문 경우solaris의 fcntl은 F_SETLKW에 대해 -1보다 작은 값을 반환합니다.

int ret; 

while ((ret = fcntl(lock_fd, F_SETLKW, &unlock_it)) < 0 && errno == EINTR) { 
    /* nop */ 
} 

if (ret < 0) { 
    ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf, 
       "fcntl: F_SETLKW: Error getting accept lock, exiting! " 
       "Perhaps you need to use the LockFile directive to place " 
       "your lock file on a local disk!"); 
    clean_child_exit(APEXIT_CHILDFATAL); 
} 

, 우리의 시스템 중 하나에서 아파치이의 beacuse이 테스트에 실패 종료됩니다. 나는 이것이 fcntl에 의해 반환 된 -1보다 작은 음의 값에 기인 한 것으로 의심된다.

그래서 언제 solaris의 fcntl이 -1보다 작은 값을 리턴합니까? 코드 샘플에서

답변

0
  1. 은 fcntl을 반환 < 0 (예 : -1 당신은 알고있다)의 errno가 EINTR 아니었다면 수단에 오류가있을 수 있습니다, 그리고 만약의 errno == EINTR (중단), 그냥 제안, 오류가 아닙니다 다시 재 시도.
  2. "성공적으로 완료되면 F_SETLKW에 대해 반환 된 값은 -1 이외의 값이되고 성공하면 0 또는> 0을 반환하고"> = 0 "이 -1이 아닌 값 인 경우 solaris에있는 fcntl의 Mannul 당신이 생각한대로 < -1이 아닙니다.
+0

나는이 코드 스 니펫을 이해할 수 있지만, fcntl이 실패했는지를 판단하는 데 약간의 걱정거리가있다. solaris의 mannul에서 fcntl은 성공적으로 완료되면 -2와 같은 값을 반환 할 수 있습니다. 이 코드에서 아파치는 오류 메시지와 함께 종료됩니다. 이게 문제가 되나요? 게다가 fcntl은 성공적으로 완료되면 -1보다 작은 값을 반환하지 않습니다. 제 질문은 이것이 언제 일어날 것인가입니다. –

+0

아니요. fcntl은 -1을 반환합니다. 그 이유는 Apache가 높은 부하를 받고있는 Solaris (이 경우 fcntl은 -1을 반환하고 errno는 ENOLCK)와 Apache가 위에서 기반한 다른 오류와 동일한 오류 로그를보고 할 때 잠금을 얻지 못할 수 있기 때문입니다 암호. 높은 부하 상태에서의 ENOLCK 보고서는 Solaris의 알려진 문제입니다. – Test

+0

당신의 적절한 조치는 다음과 같아야합니다. 반환 값과 errno를 로그하는 아파치 코드를 해킹하여 확인하십시오. 근본 원인을 발견하게 될 것입니다. – Test

관련 문제