LINUX.ORG.RU

Вопросы начинающего программить в *nix


0

0

Недавно понял, что пока я не стану писать под UNIX/Linux, я его(их) нормально не изучу, даже как пользователь.

В связи с этим у меня вопрос: Не могу найти описание константы EXIT_SUCCESS для вызова exit()... Откуда черпать, где находить описание констант, функций, структур ? Если ответ подразумевается "в исходниках", то где они располагаются ? Man-ы если и есть, то не на все функции...


оч. много инфы можно подчерпнуть из `info glibc`

ale ★★
()

man stdlib.h

anonymous
()

grep твой друг
$ grep EXIT_SUCCESS -r /usr/include/
/usr/include/stdlib.h:#define EXIT_SUCCESS 0 /* Successful exit status. */

logIN
()

> Не могу найти описание константы EXIT_SUCCESS для вызова exit()...

EXIT_SUCCESS не имеет непосредственного отношения ни к Linux,
ни к любой другой ОС. EXIT_SUCCESS описана параграфом 7.20
стандарта C99, и согласно ему должна быть определена в <stdlib.h>

Стандарт C++ также описывает EXIT_SUCCESS и согласно ему она
определена в <cstdlib>

А вообще это все фигня ;-) EXIT_SUCCESS это просто 0 на всех
известных мне платформах.

Onanim
()
Ответ на: комментарий от Onanim

ВСЕМ СПАСИБО за информацию ! Немного не согласен с <Onanim>, т.к. надо стремиться писать переносимые приложения (даже если на начальном этапе этот вопрос не стоит).

gtyrin
() автор топика
Ответ на: комментарий от gtyrin

gtyrin:

> ВСЕМ СПАСИБО за информацию ! Немного не согласен с <Onanim>,
> т.к. надо стремиться писать переносимые приложения (даже если на
> начальном этапе этот вопрос не стоит).
>
> это я по поводу exit(0); ;-)

Чтобы писать переносимые приложения надо ознакомиться со стандартами.
Открываем C99 (ISO/IEC 9899:1999) и в параграфе "7.20.4.3 The exit function" читаем:

.........
5 Finally, control is returned to the host environment. If the value
of status is zero or EXIT_SUCCESS, an implementation-defined form of
the status successful termination is returned.
.........

Для тех, кто в танке - "... zero or EXIT_SUCCESS ...".

Onanim
()
Ответ на: комментарий от gtyrin

gtyrin:

> Немного не согласен с <Onanim>, т.к. надо стремиться писать переносимые приложения...

Тут как раз не все так просто, и использование EXIT_SUCCESS может "де факто" привести к _меньшей_ портабильности.

На POSIX системах EXIT_SUCCESS = 0. В качестве кодов возврата следует использовать целые от 0 до 255, так как старшие биты используются для других целей и будут игнорированы. На не-POSIX системах может быть иначе -- например, VMS иначе трактует коды возврата, поэтому _теоретически_ использование EXIT_SUCCESS более портабельно (если принимать во внимание не-POSIX системы, да еще и отличные от Вындовс).

_НО_

В некоторых POSIX системах была (и все еще жива!) знаменитая опечатка в stdlib.h, много лет кочующая от версии к версии, где EXIT_SUCCESS определялся как 1. По-моему, ее Сантехники запустили.

Так что каждый ССЗБ...

Die-Hard ★★★★★
()
Ответ на: комментарий от Onanim

Onanim:

IMHO поскольку код возврата дается на откуп операционной системе, ссылки на языковые стандарты вообще мало чем помогут...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> поскольку код возврата дается на откуп операционной системе, ссылки
> на языковые стандарты вообще мало чем помогут...
>

Раз уж мы флеймим о конкретном макросе EXIT_SUCCESS то его можно
обсуждать только в контексте языкового стандарта C. Только там он
и определен (а SUS наследует это определение).

Процитирую фрагмент целиком:

5 Finally, control is returned to the host environment. If the value
of status is zero or EXIT_SUCCESS, an implementation-defined form of
the status successful termination is returned. If the value of status
is EXIT_FAILURE, an implementation-defined form of the status
unsuccessful termination is returned. Otherwise the status returned is
implementation-defined.

То есть exit(0) и exit(EXIT_SUCCESS) оба приведут к одному и тому же
результату. Но _совершенно_ не обязательно, что именно 0 будет виден
"снаружи" программы как ее выходной статус. Во всех случаях (как
указано в стандарте) "an implementation-defined form of the status is
returned". Тот статус, с которым вызывается exit() не имеет никакой
прямой связи с тем, что будет видно "снаружи" программы.
Это нам в Unix просто повезло, что код из exit() напрямую пишется
в termination status :-)))

BTW насчет VMS. Да, там вроде успешный статус - это не 0 (1?).
Но для C программиста это теоретически должно быть по барабану -
если он скажет exit(0) или exit(EXIT_SUCCESS) этот код должен
быть оттранслирован в то, что на VMS считается "success".
На эту тему до сих пор иногда ведутся дискуссии в comp.lang.c

HTH







Onanim
()
Ответ на: комментарий от Onanim

> То есть exit(0) и exit(EXIT_SUCCESS) оба приведут к одному и тому же результату. Но _совершенно_ не обязательно, что именно 0 будет виден "снаружи" программы как ее выходной статус.

Это относительно новые веяния в стандартах. Это -- c99. То же самое, что и употребление 0 вместо NULL (несмотря на то, что NULL поинтер может не быть "все биты 0", согласно C99 char *p=0; приведет к инициализации p указателем NULL).

Пока что в мире гораздо больше не-C99 компиляторов, которые не придерживаются столь революционных соглашений, поэтому слепо полагаться на C99 я бы не стал.

Мне, например, до сих пор приходится принимать во внимание K&R компиляторы...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

>> То есть exit(0) и exit(EXIT_SUCCESS) оба приведут к одному и тому
>> же результату. Но _совершенно_ не обязательно, что именно 0 будет
>> виден "снаружи" программы как ее выходной статус.

> Это относительно новые веяния в стандартах. Это -- c99.

Хмм... не поленился, нашел старый пыльный draft C89 (aka ANSI C).
Пофтыкал. Не поверишь - та же самая фраза в описании exit() про
эквивалентность exit(0) и exit(EXIT_SUCCESS) и про все остальное,
касательно статуса завершения. Почти cut'n paste :-)))
Так что это совсем не новые веяния. Да собственно так ведь всегда
и было de-facto, даже во времена K&R, мне не совсем понятно,
с чем ты споришь. Ты же вроде тоже сказал, что exit(0) ничем не
хуже exit(EXIT_SUCCESS), я просто подводил под этот "интуитивный"
факт документальное подтверждение, цитируя стандарт ;-)

> То же самое, что и употребление 0 вместо NULL

Не вижу никаких аналогий :-/ Это тут причем?

> Мне, например, до сих пор приходится принимать во внимание K&R
> компиляторы...

Если не секрет, то какие это компиляторы до сих пор K&R-only,
даже без C89? Какой-то cross-compiler для embedded?

Onanim
()
Ответ на: комментарий от Onanim

>То же самое, что и употребление 0 вместо NULL

имелось ввиду что инвалидный указтель не обязательно имеет
значение 0 для данной архитектуры,
но это проблеммы компилятора, а не твои,
когда он встречает 0 он заменяет его на нужное значение,
а NULL это всего лишь удобный синоним не больше не меньше и
если везде ставить ноль вместо NULL, портабельности это не уменьшит,

тоже самое с exit(0), в качестве кода не обязательно будет возвращен 0,
будет возвращено значение означающие успех, а 0 всего лишь его синоним.

anonymous
()
Ответ на: комментарий от Onanim

А вот используя 0 вместо NULL можно очень больно попасть:

execlp("/bin/sh", "/bin/sh", "-c", "ls", 0);

не будет работать на x86_64

anonymous
()
Ответ на: комментарий от anonymous

>> То же самое, что и употребление 0 вместо NULL

> имелось ввиду что инвалидный указтель не обязательно имеет
> значение 0 для данной архитектуры, но это проблеммы компилятора,
> а не твои, когда он встречает 0 он заменяет его на нужное значение,
> а NULL это всего лишь удобный синоним не больше не меньше и
> если везде ставить ноль вместо NULL, портабельности это не уменьшит,

Это все безусловно понятно. Что мне непонятно - какое отношение
имеет NULL указатель к обсуждавшемуся вопросу про exit(). Или я
чего-то не понимаю... :-/

> тоже самое с exit(0), в качестве кода не обязательно будет
> возвращен 0, будет возвращено значение означающие успех,
> а 0 всего лишь его синоним.

Ну... в целом правильно... это в стандарте и написано,
я собственно его и цитировал. Об чем собственно спор-то?

Onanim
()
Ответ на: комментарий от Onanim

Onanim (04.11.2005 18:13:54):

> Так что это совсем не новые веяния.

Уболтал :)

> C89 (aka ANSI C)

Кстати, помню, как я тупо таращился на строчку, выданную мне Хпуксовским найтивным компилятором: "error 1705: Function prototypes are an ANSI feature". Изучение манов привело меня к опции -Aa, на которую компилер бодро отрапортовал, что она доступна только в коммерческой версии...

> Да собственно так ведь всегда и было de-facto, даже во времена K&R

Угу -- в "мире Юникса", который потом стал POSIX'ом...

> мне не совсем понятно, с чем ты споришь.

Дык, я и не спорю особо. Просто заметил, что в POSIX системах из-за упомянутого мной распространенного бага exit(0) de-facto более портабилен, чем exit(EXIT_SUCCESS).

> То же самое, что и употребление 0 вместо NULL

Не вижу никаких аналогий :-/ Это тут причем?

Прямая аналогия: если ты в С99 напишешь char *p=(char*)1;, то поинтер тебе проинициализируется как 0x1. А если ты скажешь char *p=(char*)0; (или, что то же, просто char *p=0;), то компилер инициализирует поинтер системозависимым объектом NULL. Не везде это побитовый 0!

> Если не секрет, то какие это компиляторы до сих пор K&R-only, даже без C89? Какой-то cross-compiler для embedded?

Да нет, просто старые машинки еще кое-где работают.

Die-Hard ★★★★★
()
Ответ на: комментарий от Onanim

Onanim (04.11.2005 18:40:11):

> Что мне непонятно - какое отношение имеет NULL указатель к обсуждавшемуся вопросу про exit().

Никакого, успокойся! :)

Просто _отвлеченная_ аналогия была.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

>> Да собственно так ведь всегда и было de-facto, даже во времена K&R

> Угу -- в "мире Юникса", который потом стал POSIX'ом...

А шо, есть другой мир? :-)
Даже если и есть - мы-то живем в этом, лучшем из миров :-)
Ну а если какой другой мир начинает нас домогаться, у нас достаточно
кросс-платформенных библиотек, чтобы отбиться :-)))

Onanim
()
Ответ на: комментарий от Die-Hard

> а NULL это всего лишь удобный синоним не больше не меньше и
> если везде ставить ноль вместо NULL, портабельности это не уменьшит,

Это, очевидно, неверно. См. пример выше.

anonymous
()
Ответ на: комментарий от anonymous

anonymous:

>> а NULL это всего лишь удобный синоним не больше не меньше и если везде ставить ноль вместо NULL, портабельности это не уменьшит,

> Это, очевидно, неверно. См. пример выше.

Это _почти_ верно.

В приведенном примере 0 не является "синонимом" NULL просто потому, что компилятор ничего не знает (и не может знать!) о том, что этот 0 имеет какое-либо отношение к указателям.

Но пример весьма показательный!

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.