2009-10-13 5 views
0

À partir du Mannul de fcntl dans solaris, à la fin du processus, la valeur renvoyée pour F_SETLKW sera "Valeur autre que -1". Mais Apache httpd 1.3.41 code source (fichier http_main.c) vérifier si la valeur retournée est positive comme:Quand fcntl dans solaris renverra-t-il une valeur inférieure à -1 pour F_SETLKW

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); 
} 

Dans le cas très rare, apache dans l'un de notre système quittera beacuse de ce échoué au test. Je soupçonne que cela a été causé par une valeur négative inférieure à -1 retournée par fcntl.

Alors, quand fcntl dans solaris retournera-t-il une valeur inférieure à -1?

Répondre

0
  1. dans votre exemple de code, fcntl retourne < 0 (par exemple -1 vous savez) des moyens pourraient avoir des erreurs si errno n'a pas été EINTR, et si errno == EINTR (interrompu), il est une erreur, juste suggérer réessayer à nouveau.
  2. "A partir du Mannul de fcntl dans solaris, à la fin, la valeur renvoyée pour F_SETLKW sera Valeur autre que -1", signifie que retourne 0 ou> 0 lorsque le succès, "> = 0" est une valeur autre que -1 , pas < -1 comme vous l'avez deviné.
+0

Je peux comprendre ces extraits de code, mais avec une certaine inquiétude que la condition de juger si fcntl a échoué. De la mannul de solaris, fcntl pourrait retourner une valeur comme -2 avec succès. Dans ce code, apache va sortir avec msg d'erreur. C'est un problème? En outre, il semble que fcntl ne renvoie presque pas de valeur inférieure à -1 avec succès. Ma question est que quand cela arrivera-t-il? –

+0

Le numéro fcntl renvoie -1. La raison pour laquelle il sortira est qu'il risque de ne pas obtenir le verrou lorsque Solaris est sous forte charge, dans ce cas, fcntl renvoie -1, et errno est ENOLCK, alors qu'Apache rapporte le même journal d'erreur que les autres erreurs basées sur code. Rapports ENOLCK sous des charges élevées est le problème connu de Solaris. – Test

+0

donc votre action correcte devrait être: vérifier en piratant le code apache pour consigner la valeur de retour et errno. vous trouverez ce qui était la cause première. – Test

Questions connexes