2 Pytanie: Dlaczego przechwycony kod sys.exit () różni się od podanego?

pytanie utworzone w Thu, Mar 28, 2019 12:00 AM

Mam program c ++, który uruchamia program python przy użyciu komendy system(). Zwróciłem pewną wartość, używając kodu błędu sys.exit() w kodzie Pythona. Ale kiedy przechwytuję zwróconą wartość z powrotem w c ++, różni się ona od tej, którą zakodowałem w programie Pythona.

Mój kod Pythona: test.py

    import sys
    sys.exit(10)

Mój kod 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;
     }

kiedy uruchomię test.cpp, dostałem 2560 Dlaczego tak się dzieje?

    
1
2 odpowiedzi                              2                         

Standard C ++ odracza się do C (C ++ 17 do C11) dla tego aspektu i ma to do powiedzenia:

  

Jeśli argument jest wskaźnikiem zerowym, funkcja systemowa zwraca wartość niezerową tylko wtedy, gdy a   dostępny jest procesor poleceń. Jeśli argument nie jest wskaźnikiem zerowym, a funkcja systemowa zwraca, zwraca wartość zdefiniowaną przez implementację.

Zakładając, że używasz Linuksa lub innego systemu typu POSIX-y, kod powrotu odpowiada kodowi stanu, który zostanie wypełniony przez połączenie wait().

To nie jest proste mapowanie, ponieważ musi być w stanie zwrócić wszystkie rodzaje meta-informacji o tym, dlaczego proces zakończył się, poza prostym kodem wyjścia (pomyśl o sygnałach zabijających proces , na przykład).

Oznacza to, że prawdopodobnie musisz użyć tych samych makr , które chcesz za wait(), jeśli chcesz uzyskać poprawne wartości.

W szczególności powinieneś używać czegoś takiego:

if (WIFEXITED(value))
    printf("Normal exit, returned %d\n", WEXITSTATUS(value));

W konkretnej implementacji prawdopodobnie przesuwa wartość zwrotną o osiem bitów w lewo i wykorzystuje pozostałe bity do określenia wszystkich innych przydatnych rzeczy. Jest to szczegół implementacyjny, więc niekoniecznie musi być poprawny, ale jest to dobrze wyedukowane przypuszczenie.

    
5
2019-03-28 12: 00: 49Z
  1. @ SombreroChicken Chciałbym móc skomentować komentarze. Aby to przeliterować: dolne osiem bitów wartości przekazanej do exit jest zwracane w wyższym bajcie kodu statusu (pamiętaj, że te API pochodzą z czasów, gdy int było tylko 16 bitów).
    2019-03-28 11: 48: 47Z
  2. @ MartinBonner Wiem, że w dzisiejszych czasach nie wolno ci żartować. Właściwie głosowałem za tą odpowiedzią, ponieważ jest całkowicie poprawna. My zrzędliwi programiści chcą tylko poważnych komentarzy !!!!! W porządku, bud.
    2019-03-28 11: 51: 24Z
  3. @ paxdiablo Perfect! Zakładam, że to makro będzie ważne dla wszystkich implementacji sprzętu.
    2019-03-29 04: 32: 19Z
  4. Cóż, jak już wspomniano, ISO C po prostu stwierdza, że ​​zdefiniowano jego implementację. Makra są przeznaczone dla systemów podobnych do POSIX, w tym Linuxa (i BSD, jak sądzę). Na przykład Windows stwierdza, że ​​zwraca wartość, którą zwrócił interpreter poleceń.
    2019-03-29 05: 58: 46Z
  5. @ Prayag, ponownie zdefiniowano jego implementację. Powiedziałbym, że na podstawie tego, co widzisz, kod powrotu przekazany do środowiska jest ograniczony do określonego zakresu, tak że górne bity mogą być użyte do tej dodatkowej informacji.
    2019-04-03 08: 24: 21Z

Tak jak powiedział paxdiablo, rzeczywiście jest to X*256, gdzie X jest kodem powrotu. Przeglądając dokumentację w C ++, wynik działania systemu MAY zawiera kod błędu lub nie, zdefiniowano implementację:

Sprawdź: to i to . chcesz użyć wyjścia i kodu powrotu w systemach POSIX, powinieneś być w stanie użyć wait

    
1
2019-03-28 11: 45: 43Z
źródło umieszczone tutaj