เป็นไปได้ที่จะเห็นการตายที่ประสบความสำเร็จ?


13

ในman psมันชัดเจนว่ารัฐต่าง ๆ กระบวนการสามารถมีบน Linux

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.

แม้สรรพสินค้าXเป็นสถานะของกระบวนการก็ไม่ควรที่จะเห็น แต่นั่นถูกต้องหรือไม่ มีวิธีทางทฤษฎีที่จะเห็นว่าเป็นรัฐในกระบวนการหรือไม่? หรือเป็นไปไม่ได้ 100% อย่างสมบูรณ์?


2
การใช้งานควรและความจริงที่ว่าในหน้าคู่มือบ่งบอกว่ามันเป็นไปได้จริงที่จะเห็นมัน ฉันไม่รู้ว่าอย่างไรหรือเมื่อไหร่
terdon

คำตอบ:


7

ฉันดำดิ่งลงไปในลีนุกซ์เคอร์เนลเล็กน้อย, โดยที่ไม่รู้ว่ามันทำงานอย่างไรในแกนกลางของมัน, หรือความรู้ C ตัวใหญ่ ๆ ดังนั้นโปรดดีกับทฤษฎีนี้ :)

DEADรัฐถูกกำหนดhttps://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141และมีการใช้ที่https://github.com/torvalds/linux/blob/master/fs /exec.c#L974เพื่อให้สถานะการส่งคืนเท่านั้น ดังนั้นวิธีเดียวที่จะสามารถเห็นได้คือถ้าคุณตรวจสอบสถานะของกระบวนการก่อนหน้าhttps://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (หรือหลังจากนั้นไม่ว่าจะเรียกฟังก์ชันใด จาก..).

หากคุณพยายามที่จะฆ่ากระบวนการที่ตายแล้วกระบวนการดังกล่าวจะได้รับการดูแลและเพิกเฉยที่https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

ตามทฤษฎีแล้ว ... ฉันคิดว่าคำตอบคือใช่ X เป็นรัฐที่สามารถมองเห็นได้ในทางทฤษฎี แต่อาจไม่เคยมีมาก่อนในชีวิตจริง ..

โปรดแก้ไขฉันหาก / ที่ฉันผิด .. ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้เลย ..


2
ฉันสามารถดูได้ด้วยuntil sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
Stéphane Chazelas

นี่คือลักษณะของกระบวนการ (ผลลัพธ์ของ /proc/.../stat) 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.. ตอบคำถาม X เป็นไปได้! ขอบคุณ!
ดาวตก

1

นี่คือหลักฐานหนึ่งที่เราเพิ่งพบเจอในระบบสด:

$ sudo ps axf -O wchan
31103 -      R ?        00:00:00 /bin/bash /usr/local/bin/monitorcron taskA
31104 exit   X ?        00:00:00  \_ [su]

คุณจำได้หรือไม่ว่ากระบวนการหายไปเมื่อคุณวิ่งครั้งต่อไปpsหรือไม่?
Hitechcomputergeek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.