#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