Unix History: mengembalikan kode oktal?

10

Saya terlempar lengah hari ini oleh gdb:

Program exited with code 0146.

gdbmencetak kode kembali dalam oktal ; mencari tahu mengapa saya menemukan: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Tapi itu bukan jawaban yang sangat memuaskan. Beberapa googling cepat tidak mengungkapkan sejarah, jadi saya berharap seseorang di SO mungkin tahu cerita belakangnya.

Pertanyaan yang agak terkait, bagaimana orang akan melihat kode kembali dalam oktal? Mungkin mesin lama selalu mencetak kode pengembalian?

$ printf %o\\n $?

Cukup canggung :)

Menepuk
sumber
itu $?adalah nilai shell untuk kode pengembalian, dan merupakan angka desimal (atau apakah gdb mendukung contoh cmd Anda juga?). Tidak tahu mengapa gdb melaporkannya dalam oktal. Solusi saya adalah keluar dari 'ol man asciiuntuk melihat apa arti nilai oktal. Pertanyaan menarik, karena Anda juga mengalami nilai oktal dari program lain. Mungkin itu dibahas dalam Kernighan dan Pike 'Unix Programming Envioronment'. Semoga berhasil.
shellter
Status keluar bisa lebih besar dari satu digit, sebenarnya byte. Juga, man asciitidak akan berguna untuk mengubah oktal ke desimal. bcakan menjadi pilihan yang lebih baik.
jlliagre
2
Kode kembali adalah angka , bukan desimal atau oktal. Program mengembalikan status (satu byte). Dengan menunggu (3) atau sukunya proses induk dapat mengetahui banyak informasi tentang mengapa proses keluar (biasanya, yaitu, secara sukarela dengan memanggil keluar (2); dibunuh oleh sinyal, ...)
vonbrand

Jawaban:

6

Representasi oktal memudahkan interpretasi kode keluar untuk nilai-nilai kecil, yang merupakan yang paling umum digunakan. Jika angka ini, yang merupakan byte, dicetak dalam desimal, menemukan sinyal mana yang menghentikan suatu proses akan memerlukan sedikit perhitungan sementara dalam oktal, mereka dapat dibaca sebagaimana adanya:

  • sebuah proses keluar dengan status 5, gdbmenampilkan 05yang tidak membuat perbedaan
  • sebuah proses keluar karena mendapat SIGINT( Control+ C), gdbtampilan 0202yang lebih mudah dikenali sebagai sinyal # 2 daripada 130.

Selain itu, status keluar juga mungkin sedikit topeng dan dalam kasus seperti itu, oktal (setidaknya ketika Anda terbiasa dengan itu yang lebih umum beberapa dekade yang lalu daripada hari ini) lebih mudah untuk mengubah mental menjadi bit daripada desimal atau bahkan heksadesimal, seperti misalnya chmodmasih menerima bilangan oktal untuk mewakili hak akses file: 0750 = 111 101 000 = rwx r-x ---.

Jlliagre
sumber
mungkin tempat yang salah untuk menanyakan hal ini, tetapi apakah ada cara mudah untuk mengetahui apakah angka yang diberikan oleh GDB dalam oktal atau desimal?
marinara
3
Konvensi ini jika dimulai dengan nol (0), itu oktal.
jlliagre
3

Saya tidak memiliki salinan teks ini dan hanya membaca uraian singkat yang tersedia di buku google tetapi. Menurut panduan X / Open Portability, Perintah & Utilitas Spesifikasi Sistem V hal 283 (menurut buku google)

jika aplikasi berhenti secara tidak normal, status keluarnya adalah status oktal 0200 +, dan ada daftar nilai umum 'status' (yang mungkin juga diberikan dalam oktal).

Jadi ini adalah pesan kesalahan pria miskin.


sumber