15

Python os.wait()関数の結果をデコードしようとしています。Pythonのドキュメントによると、これは次のようになります。

pidと終了ステータスの表示を含むタプル:16ビットの数値。下位バイトはプロセスを強制終了した信号番号であり、上位バイトは終了ステータスです(信号番号がゼロの場合)。コアファイルが作成された場合、下位バイトの上位ビットが設定されます。

終了ステータス表示(整数)をデコードして、上位バイトと下位バイトを取得するにはどうすればよいですか?具体的には、次のコードスニペットで使用されるデコード関数を実装するにはどうすればよいですか。

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
4

7 に答える 7

14

これはあなたが望むことをします:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
于 2008-08-13T17:56:34.167 に答える
12

一般的な質問に答えるには、ビット操作を使用できます

pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8

ただし、終了ステータス値を解釈するための組み込み関数もあります。

pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )

以下も参照してください。

  • os.WCOREDUMP()
  • os.WIFCONTINUED()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()
于 2008-08-13T18:52:36.270 に答える
2
exitstatus, signum= divmod(status, 256)
于 2009-03-26T23:48:20.277 に答える
2

structモジュールを使用して、int を unsigned バイトの文字列に分割できます。

import struct
i = 3235830701  # 0xC0DEDBAD
s = struct.pack(">L", i)  # ">" = Big-endian, "<" = Little-endian
print s         # '\xc0\xde\xdb\xad'
print s[0]      # '\xc0'
print ord(s[0]) # 192 (which is 0xC0)

これをarrayモジュールと組み合わせると、より便利に実行できます。

import struct
i = 3235830701  # 0xC0DEDBAD
s = struct.pack(">L", i)  # ">" = Big-endian, "<" = Little-endian

import array
a = array.array("B")  # B: Unsigned bytes
a.fromstring(s)
print a   # array('B', [192, 222, 219, 173])
于 2009-03-26T14:52:42.200 に答える
1

ビットシフトおよびマスキング演算子を使用して、ステータスを解凍できます。

low = status & 0x00FF
high = (status & 0xFF00) >> 8

私はPythonプログラマーではないので、構文が正しいことを願っています。

于 2008-08-13T17:58:27.563 に答える
0

私の前の人々はそれを釘付けにしましたが、本当に1行でそれをしたい場合は、これを行うことができます:

(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)

編集:逆に持っていました。

于 2008-08-13T18:14:10.947 に答える