W man ps
jasno określa różne stany procesu w Linuksie.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
Nawet jeśli X
jest to stan procesu, nigdy nie należy go widzieć. Ale czy to prawda? Czy istnieje teoretyczny sposób postrzegania tego jako stanu procesu? Czy to całkowicie niemożliwe w 100%?
linux
linux-kernel
history
Xeor
źródło
źródło
Odpowiedzi:
Zanurzyłem się trochę w jądrze Linuksa, nie wiedząc, jak działa w jego rdzeniu ani jakiejkolwiek dużej znajomości języka C. Więc proszę bądź miły z tą teorią :)
DEAD
Stan określa https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 i jest stosowany w https://github.com/torvalds/linux/blob/master/fs /exec.c#L974, aby dać tylko status zwrotu. Jedynym sposobem, w jaki można to kiedykolwiek zobaczyć, jest sprawdzenie stanu procesu przed https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (lub później, gdziekolwiek ta funkcja zostanie wywołana z..).Jeśli spróbujesz zabić martwy proces, zostanie to załatwione i zignorowane na https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363
Więc teoretycznie ... Myślę, że odpowiedź brzmi tak. X jako stan można postrzegać w teorii, ale prawdopodobnie nigdy nie był w prawdziwym życiu.
Proszę mnie poprawić, jeśli / gdzie się mylę .. W ogóle nie jestem tego pewien ...
źródło
until sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
4603 (sleep) X 0 -1 -1 0 -1 4202508 0 0 0 0 0 0 0 0 20 0 0 0 175042279 0 0 0 0 0 0 0 0 0 0 0 0 18446744071579306375 0 0 17 0 0 0 0 0 0
.. Odpowiedzi na pytanie. X jest możliwy! Dzięki!Oto dowód takiego, na który właśnie natknęliśmy się na system na żywo:
źródło
ps
?