Звідки взявся «вихід (-1)»?


22

Я бачу в багато успадкованого програмного забезпечення і погані підручники в Інтернеті , який рекомендується використовувати exit(-1), return -1або східного представляти «аварійне завершення». Проблема полягає в тому, що принаймні в POSIX -1ніколи не було і не є дійсним кодом статусу. man 3 exitілюструє, що exit()повертає значення status & 0377батьківського значення, тобто значення, яке -1стає 255. У системах, що не EXIT_FAILUREє POSIX, рекомендується для перенесення. Але я ніколи не бачу, щоб "-1 означає аномальне припинення" спільно з "EXIT_FAILURE може бути чимось іншим, ніж 1", що вказує на те, що вони чітко вважають, що "-1" є звичайним навіть у системах, що не є POSIX.

Ось приклад питання StackOverflow, який продовжує це. Програмне забезпечення "unrealircd" також є прикладом програми, яка використовується exit(-1)для припинення програми. На практиці це ускладнює взаємодію з ними systemd.

Звідки взявся цей антидіапазон? Чи дійсно це в якомусь контексті?


1
"У Unix-подібних систем є чітка конвенція, що статус виходу 0 позначає успіх, а будь-який ненульовий статус виходу позначає збій ... Ця конвенція досить сильно з'єднана в оболонки Unix ..." ( Ненульовий статус виходу для чистого виходу )
гнат

@gnat Відповідно до посібника з libc статус виходу явно від 0 до 255 включно. Якщо десь є відповідь, яка говорить про те, що негативні значення в один момент були дійсними, я б прийняв це, але вважаю це дуже сумнівним.
користувач222973

1
@gnat "255" легко вписується в unsigned char.
користувач222973


1
@gnat Байт у "Java" не є непідписаним знаком, він більше еквівалентний, charоскільки його діапазон значень становить від -128 до 127. Крім того, я вже заявив, що "-1" перетворюється на "255" в моєму питальному тілі .
користувач222973

Відповіді:


20

Практично всі комп’ютери Unix використовують подвійні доповнення для цілих чисел, а в двох-доповненнях -1 завжди є "всі біти 1" незалежно від розміру слова. Якщо ви хочете отримати максимально можливий код виходу незалежно від розміру статусу виходу програми, використовуючи -1 і дозволяючи бібліотеці усікати її зручно, це робить свою справу.

Це корисно, оскільки коли сценарії або програми мають більше одного можливого стану виходу (див. grepПростий приклад), значущі з них зазвичай присвоюються найменшим числам, що робить найбільший можливий код виходу хорошим, який слід використовувати для "невідомої помилки" або " перервати », оскільки навряд чи коли-небудь конфліктуватиме зі значущим значенням статусу.


Візьмемо як приклад glibc, який реалізує exit()як status &= 0xff. Чи є "розмір слова", в якому -1 & 0xffнемає 255? Звичайно, ні, адже вся мета полягає в тому, щоб зробити його відповідним до діапазону 0-255. Незважаючи на те, ваше останнє речення не має сенсу: коди статусу 128-255 мають спеціальне призначення в системах UNIX.
користувач222973

2
Не плутайте значення виходу Bash (які 0-127, 128+ є спеціальними значеннями Bash) із програмними значеннями виходу (які становлять 0-255, див. Pubs.opengroup.org/onlinepubs/009695399/functions/exit.html ). Що стосується розміру, пам’ятайте, що програмісти C мали справу з декількома розмірами слів (спочатку 12, 16 та 32 біти) з самого початку, тому ми автоматично намагаємося ідіоми, які не вимагають від нас врахування розміру слова. Оскільки Unix передував Posix протягом 2 десятиліть, не завжди було 8-бітове обмеження, тому ми писали, щоб це не мало значення.
Тодд Кнарр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.