À 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?
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? –
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
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