Jaka jest różnica między wyjściem (0) a wyjściem (1) w C?

97

Czy ktoś może mi powiedzieć? Jaka jest różnica między exit(0)iw exit(1)języku C?

Yu Hao
źródło

Odpowiedzi:

118

Jaka jest różnica między exit(0)iw exit(1)języku C?

exit(0)wskazuje pomyślne zakończenie programu i jest w pełni przenośny, podczas gdy
exit(1)(zwykle) wskazuje na nieudane zakończenie. Jednak jego użycie nie jest przenośne.

Zauważ, że standard C definiuje EXIT_SUCCESSi EXIT_FAILUREzwraca status zakończenia z programu C.

0i EXIT_SUCCESSsą wartościami określonymi przez standard w celu wskazania pomyślnego zakończenia, jednak tylko EXIT_FAILUREstandardowa wartość zwracająca nieudane zakończenie. 1jest używany do tego samego w wielu implementacjach.


Odniesienie:

C99 standardowe: 7.20.4.3 exitfunkcja
§ 5

Wreszcie kontrola jest zwracana do środowiska hosta. Jeśli wartość statusu jest równa zero lub EXIT_SUCCESS, zwracana jest zdefiniowana w implementacji forma pomyślnego zakończenia statusu. Jeśli wartość statusu to EXIT_FAILURE, zwracana jest zdefiniowana w implementacji forma statusu niepomyślne zakończenie. W przeciwnym razie zwracany status jest zdefiniowany jako implementacja.

Alok Save
źródło
1
Czy możesz wyjaśnić brak możliwości przenoszenia? W szczególności niezerowe kody wyjścia wskazują różne tryby awarii. Aplikacja często używa tego do dostarczania dalszych informacji. EXIT_FAILUREZatem pojedyncza stała ( ) jest niewystarczająca.
Konrad Rudolph
@KonradRudolph: Dodałem odpowiedni cytat. Mam nadzieję, że to pomoże.
Alok Save
1
@Als: POSIX to standard. Standard C może powiedzieć „zdefiniowane w implementacji”, ale nie jest to równoznaczne z powiedzeniem „nie przenośny”, gdy w rzeczywistości implementacje zrobić uzgodnić konwencji.
Cat Plus Plus
1
@PeterM: Znajdź mi platformę, która nie korzysta z tej konwencji. Prawdopodobnie będzie to jakieś wyspecjalizowane / osadzone / wolnostojące / jakiekolwiek środowisko, w którym przenośność exitjest najmniejszym z Twoich zmartwień (do diabła, może nawet nie być tam dostępnej biblioteki C. NIC NIE JEST PRZENOŚNE !!! 111).
Cat Plus Plus
3
@CatPlusPlus: W OpenVMS wywołanie exitz dowolną nieparzystą wartością oznacza sukces. exit(0)jest traktowany jako szczególny przypadek ze względu na zgodność C. Tak, POSIX jest standardem, ale nie wszystkie systemy są z nim zgodne. Jeśli chcesz napisać kod, który zakłada POSIX, możesz to zrobić, ale ogranicza to przenośność kodu.
Keith Thompson,
12

exit w języku C przyjmuje liczbę całkowitą reprezentującą status wyjścia.

Zakończ sukces

Zazwyczaj kod zakończenia równy 0 jest uznawany za sukces lub celowe zakończenie spowodowane pomyślnym wykonaniem programu.

Błąd wyjścia

Status wyjścia równy 1 jest uważany za błąd i najczęściej oznacza, że ​​program musiał z jakiegoś powodu zakończyć pracę i nie był w stanie pomyślnie ukończyć wszystkiego w normalnym przebiegu programu.

Oto zasób GNU mówiący o statusie wyjścia.


Jak stwierdził @Als, zamiast 0 i 1 należy użyć dwóch stałych.

EXIT_SUCCESS jest definiowany przez standard jako zero.

EXIT_FAILURE nie jest ograniczony przez standard do jednego, ale wiele systemów implementuje go jako jeden.

Sam DeHaan
źródło
9

exit(0)wskazuje, że program zakończył działanie bez błędów. exit(1)wskazuje, że wystąpił błąd.

Możesz użyć innych wartości innych niż 1do rozróżnienia różnych rodzajów błędów.

sch
źródło
3

Różnica polega na tym, że wartość zwracana środowisku jest 0w pierwszym przypadku, aw 1drugim:

$ ./prog_with_exit_0
$ echo $?
0
$

i

$ ./prog_with_exit_1
$ echo $?
1
$

Należy również pamiętać, że wartość makra EXIT_SUCCESSi EXIT_FAILUREwykorzystywane jako argument do exitfunkcji są wdrożenie zdefiniowane, ale zwykle są ustawione odpowiednio 0a liczba różna od zera. (POSIX wymaga EXIT_SUCCESS0). Więc zwykle exit(0)oznacza sukces i exit(1)porażkę.

exitWywołanie funkcji z argumentem w mainfunkcji jest równoznaczne z oświadczeniem returnz tym samym argumentem.

ouah
źródło
2

exit to wywołanie systemowe używane do zakończenia uruchomionego procesu, z którego zostało wywołane. Parametr do wyjścia służy do informowania procesu nadrzędnego o statusie procesu potomnego. Tak więc exit (0) może być używane (i często używane) do wskazania pomyślnego wykonania procesu i exit (1) do oznaczenia błędu. link referencyjny

mahtab
źródło
1

exit(0) oznacza, że ​​Program (Proces) kończy się pomyślnie.

exit(1) oznacza, że ​​program (proces) kończy się normalnie bez powodzenia.

Jeśli chcesz to zaobserwować, musisz znać obsługę sygnałów i zarządzanie procesami w Uniksie ...

wiedzieć sigaction, watipid()..for () ... takie .... API ...........

Nikunj Patel
źródło
1

exit(0)zachowuj się jak return 0w main()funkcji, exit(1)zachowuj się jak return 1. Standardem jest to, że mainfunkcja return 0, która zakończyła się pomyślnie, podczas gdy wartość niezerowa oznacza, że ​​program został zakończony z jakimś błędem.

Tomáš Šíma
źródło
1

exit (0) jest równoważne z exit (EXIT_SUCCESS).

exit (1) jest równoważne z exit (EXIT_FAILURE).

W przypadku niepowodzenia zwykle zwracana jest każda dodatnia wartość, aby wyjść z procesu, którą można znaleźć w powłoce za pomocą $ ?.

Wartość większa niż 128, która jest spowodowana przerwaniem sygnału. Więc jeśli jakiekolwiek polecenie powłoki zostało zakończone sygnałem, status powrotu musi wynosić (128 + numer sygnału).

Na przykład:

Jeśli jakieś polecenie powłoki zostanie zakończone przez SIGINT, to $? da 130 (128 + 2) (Tutaj 2 to numer sygnału dla SIGINT, sprawdź używając kill -l)

Sandeep_black
źródło
0

Kiedy plik wykonywalny kończy się (kończy pracę), zwraca wartość do powłoki, która go uruchomiła. exit(0)zwykle wskazuje, że wszystko jest w porządku, a jednocześnie exit(1)wskazuje, że coś poszło nie tak.

Ed Heal
źródło
0

Funkcja exit () powinna być zawsze wywoływana z wartością całkowitą, a wartości niezerowe są używane jako kody błędów.

Zobacz też: Używanie funkcji exit ()

Squig
źródło
0

exit function. W języku programowania C funkcja exit wywołuje wszystkie funkcje zarejestrowane w momencie wyjścia i kończy działanie programu.

exit(1)oznacza, że ​​program (proces) kończy się niepowodzeniem. Bufory plików są opróżniane, strumienie są zamykane, a pliki tymczasowe są usuwane

exit(0) oznacza pomyślne zakończenie programu (procesu).

Rashid Thattayil
źródło