सामान्य निकास स्थिति 0 से 255 तक चलती है (क्यों देखें Exit codes bigger than 255 posssible क्यों चर्चा के लिए)। आम तौर पर, स्थिति 0 सफलता को इंगित करता है; कुछ और कार्यान्वयन-परिभाषित त्रुटि है। मुझे एक ऐसे कार्यक्रम के बारे में पता है जो बाहर निकलने की स्थिति के माध्यम से डीबीएमएस सर्वर की स्थिति की रिपोर्ट करता है; यह कार्यान्वयन-परिभाषित निकास स्थितियों का एक विशेष मामला है। ध्यान दें कि आप अपने कार्यक्रमों की स्थिति के कार्यान्वयन को परिभाषित करते हैं।
मैं इसे 300 वर्णों में फिट नहीं कर सका; अन्यथा यह @ Arkadiy के जवाब पर एक टिप्पणी होगी।
Arkadiy सही है कि निकास स्थिति शब्द के एक हिस्से में, शून्य के अलावा अन्य मान सिग्नल को इंगित करते हैं जो प्रक्रिया को समाप्त कर देता है और 8 वें बिट आमतौर पर कोर डंप इंगित करता है, लेकिन बाहर निकलने की स्थिति का वह भाग मुख्य से अलग होता है 0..255 स्थिति। हालांकि, एक सिग्नल के परिणामस्वरूप एक प्रक्रिया मर जाती है जब खोल (जो भी खोल यह है) एक समस्या के साथ प्रस्तुत किया जाता है। 8-बिट मान में 16 बिट्स डेटा प्रस्तुत किए जाने हैं, जो हमेशा मुश्किल होता है। लगता है कि गोले सिग्नल नंबर लेते हैं और इसमें 128 जोड़ते हैं। इसलिए, यदि कोई प्रक्रिया किसी इंटरप्ट (सिग्नल नंबर 2, सिगिनट) के परिणामस्वरूप मर जाती है, तो शेल बाहर निकलने की स्थिति 130 के रूप में रिपोर्ट करता है। हालांकि, कर्नेल ने स्थिति को 0x0002 के रूप में रिपोर्ट किया; खोल ने संशोधित किया है कि कर्नेल रिपोर्ट क्या करता है।
निम्नलिखित सी कोड यह दर्शाता है। दो कार्यक्रम
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
, आसानी से अपने प्रकाशित कार्यक्रमों की अनिवार्य रूप से किसी भी में पाया जा सकता। यदि आपको तत्काल इसकी आवश्यकता है, तो इसे IIUG Software Archive पर SQLCMD प्रोग्राम से प्राप्त करें; वैकल्पिक रूप से, ईमेल द्वारा मुझसे संपर्क करें (मेरी प्रोफ़ाइल देखें)।
त्रुटि संदेशों के लिए stderr का उपयोग करें। – iny
स्पष्ट होने के लिए, माता-पिता की प्रक्रिया के लिए यह हमेशा संभव है कि यह सिग्नल या सामान्य निकास हो ... यह _shell_ है जो '$?' के लिए 12 9-254 पर संकेतों को मानचित्र करता है। – Random832