Quando un processo viene terminato, la shell memorizza solo un codice di ritorno a 8 bit, ma imposta il bit alto se il processo è stato terminato in modo anomalo. Ma poiché il tuo processo è terminato da un errore di segmentazione, di solito il segnale che viene inviato è SIGSEGV (riferimento di memoria non valido) che ha un valore di 11.
Quindi, poiché il tuo processo è stato terminato in modo anomalo, hai un 128 e poi aggiungi il valore del segnale che ha terminato il processo che era 11, ottieni 139.
La chiamata di sistema pertinente (che fornisce lo stato di un processo terminato) è waitpid(2). Il 139 sta per WIFSIGNALED e WTERMSIG ecc... Su Linux i bit effettivi sono descritti nel file interno /usr/include/bits/waitstatus.h che è incluso da <sys/wait.h> intestazione
Il wait , waitpid call è standard in POSIX, così come i nomi delle macro (come WTERMSIG eccetera...). L'implementazione effettiva di queste macro e i numeri di segnale effettivi, quindi il codice fornito dalla shell, sono specifici dell'implementazione.
La pagina man di signal(7) Linux fornisce il numero dei segnali.