Почему захваченный код sys.exit () отличается от предоставленного?

#python #c

#python #c

Вопрос:

У меня есть программа на c , которая запускает программу на Python с помощью system() команды. Я вернул некоторое значение, используя код ошибки, используя sys.exit() в коде python. Но когда я записываю возвращаемое значение обратно в c , оно отличается от того, которое я закодировал в программе python.

Мой код на python: test.py

     import sys
    sys.exit(10)
  

Мой код на c : test.cpp

     #include "iostream"

    using namespace std;
    int main ()
    {
      string str = "python test.py";
      const char *command = str.c_str();
      int value = system(command);
      cout<<value;
      return 0;
     }
  

когда я бегу, беги test.cpp , Я получил 2560
Почему это происходит?

Ответ №1:

Стандарт C ссылается на C (С 17 по C11) в этом аспекте, и в нем есть вот что сказать:

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

Предполагая, что вы используете Linux или какую-либо другую систему типа POSIX-y, код возврата совпадает с кодом статуса, который заполняется wait() вызовом.

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

Это означает, что вам, вероятно, нужно использовать те же макросы, что и для wait() , если вы хотите получить правильные значения.

В частности, вы должны использовать что-то вроде:

 if (WIFEXITED(value))
    printf("Normal exit, returned %dn", WEXITSTATUS(value));
  

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

Комментарии:

1. @SombreroChicken Жаль, что я не могу отклонить комментарии. Чтобы пояснить это для вас: нижние восемь бит переданного значения exit возвращаются в старшем байте кода состояния (помните, что эти API относятся ко времени, когда int было всего 16 бит).

2. @MartinBonner Я знаю, что в наши дни шутить запрещено. На самом деле я проголосовал за этот ответ, поскольку он совершенно правильный. Мы, сварливые программисты, хотим только серьезных комментариев!!!!! Все в порядке, приятель.

3. @paxdiablo Идеально! Я предполагаю, что этот макрос будет действителен для всех аппаратных реализаций.

4. Ну, как уже говорилось, ISO C просто заявляет, что это определенная реализация. Макросы предназначены для систем, подобных POSIX, включая Linux (и BSD, я полагаю). Windows, например, заявляет, что она возвращает значение, возвращенное интерпретатором команд.

5. @Prayag, опять же, это определено реализацией. Я бы сказал, основываясь на том, что вы видите, что код возврата, передаваемый обратно в среду, ограничен определенным диапазоном, так что старшие биты могут использоваться для этой дополнительной информации.

Ответ №2:

Как и сказал paxdiablo, это действительно так, X*256 где X — код возврата. Просматривая документацию на C , вывод system МОЖЕТ содержать код ошибки, а может и не содержать, определенный реализацией:

Проверьте: это и это. Если вы хотите использовать выходные данные и код возврата в системах POSIX, вы должны иметь возможность использовать wait