Обычные состояния выхода варьируются от 0 до 255 (см. Коды выхода больше 255 возможных для обсуждения причин). Обычно статус 0 указывает на успех; все остальное является ошибкой, определяемой реализацией. Я знаю о программе, которая сообщает о состоянии сервера СУБД через состояние выхода; это особый случай определяемых реализацией состояний выхода. Обратите внимание, что вы можете определить реализацию статусов ваших программ.
Я не мог вписать это в 300 символов; в противном случае это был бы комментарий к ответу @ Arkadiy.
Аркадий прав, что в одной части слова состояния выхода значения, отличные от нуля, указывают на сигнал, завершивший процесс, а 8-й бит обычно указывает на дамп ядра, но этот раздел состояния выхода отличается от основного 0 ..255 статус. Однако оболочка (какая бы она ни была) представляет проблему, когда процесс умирает в результате сигнала. 16-битные данные должны быть представлены в 8-битном значении, что всегда сложно. Кажется, что оболочки делают, чтобы взять номер сигнала и добавить к нему 128. Таким образом, если процесс умирает в результате прерывания (сигнал № 2, SIGINT), оболочка сообщает о состоянии выхода как 130. Однако ядро сообщило о состоянии как 0x0002; оболочка изменила то, что сообщает ядро.
Следующий код C демонстрирует это. Есть две программы
suicide
, который убивает себя, используя выбранный вами сигнал (по умолчанию прерывание).
exitstatus
, который запускает команду (например, suicide
) и сообщает о состоянии завершения работы ядра.
Вот 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);
}
А вот и 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);
}
Отсутствующий код stderr.c
и stderr.h
можно легко найти практически в любой из моих опубликованных программ. Если вам это нужно срочно, получите его из программы SQLCMD в IIUG Software Archive ; Вы также можете связаться со мной по электронной почте (см. мой профиль).