Los estados de salida normales se ejecutan desde 0 hasta 255 (consulte Exit codes bigger than 255 posssible para obtener una explicación de por qué). Normalmente, el estado 0 indica éxito; cualquier otra cosa es un error definido por la implementación. Sí sé de un programa que informa el estado de un servidor DBMS a través del estado de salida; ese es un caso especial de estados de salida definidos por la implementación. Tenga en cuenta que puede definir la implementación de los estados de sus programas.
No pude incluir esto en 300 caracteres; de lo contrario, habría sido un comentario a la respuesta de @ Arkadiy.
Arkadiy tiene razón en que en una parte de la palabra de estado de salida, valores distintos de cero indican la señal que finalizó el proceso y el 8º bit normalmente indica un volcado de núcleo, pero esa sección del estado de salida es diferente de la principal 0..255 estado. Sin embargo, el shell (cualquiera que sea el shell) se presenta con un problema cuando un proceso muere como resultado de una señal. Hay 16 bits de datos que se presentarán en un valor de 8 bits, que siempre es complicado. Lo que las cáscaras parecen hacer es tomar el número de señal y agregarle 128. Entonces, si un proceso muere como resultado de una interrupción (señal número 2, SIGINT), el shell informa que el estado de salida es 130. Sin embargo, el núcleo informó el estado como 0x0002; el shell ha modificado lo que informa el kernel.
El siguiente código C lo demuestra. Hay dos programas
suicide
que se mata con la señal que elija (interrupción por defecto).
exitstatus
que ejecuta un comando (como suicide
) e informa el estado de salida del kernel.
Aquí es suicide.c
:
/*
@(#)File: $RCSfile: suicide.c,v $
@(#)Version: $Revision: 1.2 $
@(#)Last changed: $Date: 2008/12/28 03:45:18 $
@(#)Purpose: Commit suicide using kill()
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 2008
@(#)Product: :PRODUCT:
*/
/*TABSTOP=4*/
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "stderr.h"
static const char usestr[] = "[-V][-s signal]";
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_suicide_c[];
const char jlss_id_suicide_c[] = "@(#)$Id: suicide.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */
int main(int argc, char **argv)
{
int signum = SIGINT;
int opt;
char *end;
err_setarg0(argv[0]);
while ((opt = getopt(argc, argv, "Vs:")) != -1)
{
switch (opt)
{
case 's':
signum = strtol(optarg, &end, 0);
if (*end != '\0' || signum <= 0)
err_error("invalid signal number %s\n", optarg);
break;
case 'V':
err_version("SUICIDE", &"@(#)$Revision: 1.2 $ ($Date: 2008/12/28 03:45:18 $)"[4]);
break;
default:
err_usage(usestr);
break;
}
}
if (optind != argc)
err_usage(usestr);
kill(getpid(), signum);
return(0);
}
Y aquí es exitstatus.c
:
/*
@(#)File: $RCSfile: exitstatus.c,v $
@(#)Version: $Revision: 1.2 $
@(#)Last changed: $Date: 2008/12/28 03:45:18 $
@(#)Purpose: Run command and report 16-bit exit status
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 2008
@(#)Product: :PRODUCT:
*/
/*TABSTOP=4*/
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "stderr.h"
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_exitstatus_c[];
const char jlss_id_exitstatus_c[] = "@(#)$Id: exitstatus.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */
int main(int argc, char **argv)
{
pid_t pid;
err_setarg0(argv[0]);
if (argc < 2)
err_usage("cmd [args...]");
if ((pid = fork()) < 0)
err_syserr("fork() failed: ");
else if (pid == 0)
{
/* Child */
execvp(argv[1], &argv[1]);
return(1);
}
else
{
pid_t corpse;
int status;
corpse = waitpid(pid, &status, 0);
if (corpse != pid)
err_syserr("waitpid() failed: ");
printf("0x%04X\n", status);
}
return(0);
}
El código que falta, stderr.c
y stderr.h
, se pueden encontrar fácilmente en prácticamente cualquier de mis programas publicados. Si lo necesita con urgencia, obténgalo del programa SQLCMD en el IIUG Software Archive; alternativamente, contácteme por correo electrónico (vea mi perfil).
Use stderr para los mensajes de error. – iny
Para ser claros, siempre es posible que un proceso principal indique si se trataba de una señal o una salida normal ... es el _shell_ el que asigna las señales a 129-254 para '$?'. – Random832