Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

144
Visualizações
system() ocasionalmente devuelve 2

He codificado una función usando la función de biblioteca system() como se muestra a continuación:

 int execute(const char* cmd) { int ret = system(cmd); if (ret != -1) { if (WIFEXITED(ret)) ret = WEXITSTATUS(ret); else ret = -1; } LINFO( "execute %s, ret = %d", cmd, ret); // logging return ret; }

Luego, lo llamé con un script de shell como se muestra a continuación:

 #!/bin/sh PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin cd $(dirname $0) agent_name=`grep 'agent_name' ../etc/config.ini |awk '{ print $3 }'` py='../../python26/bin/python' check_alive() { status=`ps -ef | grep "$agent_name" | grep -v "grep" |wc -l` if [ $status -ne 0 ]; then # process exist echo "$agent_name already exist" exit 1 fi } check_alive eval '$py ../bin/agent.py -d' status=`ps -ef | grep "$agent_name" | grep -v "grep" |wc -l` if [ $status -lt 1 ] then echo "run failed" exit -1 else echo "run succ" exit 0 fi

Pero a veces había un código de retorno extraño de 2, como se muestra a continuación:

 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 2 [INFO]execute ./admin/trystart.sh, ret = 2 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 1 [INFO]execute ./admin/trystart.sh, ret = 2

Me gustaría entender por qué había un código de retorno de 2.

================nuevo 12/06/2015 13:54========================= ===

Descubrí que cuando el sistema () devuelve 2, hubo un mensaje de error de bash como se muestra a continuación:

 bash: xmalloc: locale.c:73: cannot allocate 2 bytes (0 bytes allocated)
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Su shell devuelve el código de estado 2. Sin muchos más detalles, será difícil de diagnosticar. Fue útil agregar el mensaje de error real producido por el shell.

Si su shell es bash , como parece ser ahora, entonces el código de retorno de estado de 2 indica un error de asignación de memoria, que se confirma con el mensaje de error generado por bash :

 bash: xmalloc: locale.c:73: cannot allocate 2 bytes (0 bytes allocated)

La línea 73 es, por lo que puedo ver, la primera asignación de memoria realizada por un proceso bash recién iniciado (que se confirma con la indicación del mensaje de error de que aún no se han asignado bytes), por lo que parece probable que el problema es que malloc no puede asignar ninguna memoria.

Es posible que realmente no haya memoria disponible, especialmente si se está ejecutando en un sistema muy congestionado sin configuración de intercambio. Pero hay algunos indicios esparcidos por Internet que sugieren que esto podría tener que ver con las opciones de protección de la memoria; en particular, configuraciones en las que sbrk no está disponible pero la biblioteca malloc espera poder usarlo.

Es posible que desee iniciar un diagnóstico adicional verificando si es posible iniciar nuevos shells de manera confiable:

 for i in {0..999}; do sh -c 'exit 0' || echo Failure $?; done

Una suposición anterior, que podría ser útil para otra persona. Se recomienda corregir la invocación de la exit , aunque probablemente no tenga nada que ver con el problema particular de esta pregunta.

El shell dash , utilizado como una implementación de /bin/sh por varias distribuciones, devuelve el código de estado 2 cuando el shell sale como resultado de una condición de error.

Un posible culpable del script anterior es

 exit -1

Los códigos de retorno de estado son valores sin signo de ocho bits; en otras palabras, los códigos de retorno legales varían de 0 a 255. -1 no está en ese rango y no debe usarlo en una llamada para exit .

La exit incorporada de Bash (como la función de exit C) simplemente usa el byte de orden inferior del código de retorno proporcionado, por lo que con bash habría visto un código de retorno de 255. Pero la exit incorporada del guión espera que su argumento sea un número sin signo, y se queja de que -1 no es un número válido.

Dado que exit es un componente especial y el shell no es interactivo, el error hace que el shell se cierre, según el estándar Posix . Dash establece el código de salida en 2 cuando sale debido a un error de shell.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda