心中已經對殭屍的一些問題處理殭屍進程
- 從什麼殭屍進程概念的好處是什麼?
- 知道內核維護(PID,終止狀態,資源使用信息)殭屍進程
什麼的「資源使用信息」 - 如何殭屍的PPID()= 1,它仍然殭屍的意思,(INIT收穫殭屍,因爲它等待()默認)
可以任何一個寫一些C代碼作出殭屍它的父母是初始? - 殭屍可以拒絕釋放內存鎖嗎?
由於事先
心中已經對殭屍的一些問題處理殭屍進程
由於事先
- 殭屍過程概念有什麼好處?
殭屍進程只是一個pid,退出狀態和一些會計信息,直到父母使用wait
系列調用系列之一才能獲得其最終狀態。在父母呼叫wait
之前,孩子的進程ID必須保持標記爲已使用狀態,以便不能爲其分配任何其他進程。如果另一個進程被分配了一個回收的pid,那麼很難區分它和以前具有相同pid的進程之間的區別。一旦父母調用wait
並返回最終退出狀態,可以假定沒有人會再次在該pid處查找孩子,所以現在可以重新使用該pid。 (我想在Linux上,如果父母離開SIGCHLD爲SIG_IGN內核將不會保持周圍的殭屍,但重新註冊SIGCHLD的配置爲SIG_IGN不會有同樣的效果)
- 知道內核維護(PID ,終止狀態,資源使用信息)殭屍進程什麼的「資源使用信息」
有些信息是什麼運行的程序的含義:
time my_program
將報告。這些值通常在SIGCHLD的siginfo結構中報告(它不完全是對wait
的調用),但也可通過調用系統調用(在某些系統上)的waitid
形式獲得。有關此結構的信息,請參閱man sigaction
。
- 殭屍的PPID()如何= 1,它仍然殭屍,(INIT收割植物大戰殭屍,因爲它等待()默認情況下)
殭屍其PPID = 1不應該留一個殭屍很長時間,因爲init應該很快收穫。一個殭屍程序在它死後不久(即通過exit
或殺死它的無用信號),直到它的父母呼叫wait
並獲得它的最終狀態後,它仍然是殭屍。這意味着,即使init不做任何事情,但會一次又一次地調用init,可能會有少量時間將進程顯示爲殭屍。如果進程顯示爲init(0 = ppid)的子進程長時間(秒),則可能有錯誤。
- 任何一個可以寫一些C代碼來做一個殭屍它的父母是Init?
這是不明確的,但我想你想:
pid_t f = fork();
if (f > 0) {
exit(0); // this is the parent dying, so the child will be an orphan
// and get adopted by init
} else if (f == 0) {
sleep(100); // This is the child doing something that takes enough time for
// its parent to commit suicide (exit(0)) and then for you to
// observe that it has now been adopted by init
exit(0); // And now it dyes as well, so init should reap its status, but
// it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */
- 可殭屍拒絕釋放內存的一些鎖?
殭屍不能容納任何東西。他們失去了所有的內存頁面,打開文件句柄等等。幾乎所有的操作系統都可以弄清楚如何釋放應該被釋放。這不是一個錯誤,但要記住,操作系統必須知道它是應該被釋放的東西。在用戶空間創建資源非常簡單,當程序死亡時應該釋放操作系統不知道應該釋放的資源。
甲殭屍進程是一個純粹的PID和退出狀態值。由於資源(pid)「屬於」父項,因此無法釋放pid。如果它被釋放,另一個進程可能會被分配相同的pid,然後父進程可能會發送信號到一個不相關的進程;即使父母第一次等待確定孩子是否退出,也無法避免競爭條件。
...我想我錯過了一些東西。你正在從事什麼殭屍進程的定義? – 2010-10-04 17:46:54
已退出,但其父母未通過「waitpid」或類似接口獲得退出狀態通知的子進程。 – 2010-10-04 17:56:35
啊,是的。抱歉。我只是意識到我一直在讀「殭屍」,並想着「孤兒」。謝謝。 – 2010-10-04 18:16:16
如果您有興趣瞭解正在運行的進程列表中的殭屍進程使用:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
pid_t p = fork(); // creates child process and stores the returned PID
if (p != 0) // executed by parent process
{ sleep(1); /* the child process terminates while the parent process sleeps,
the child then becomes a zombie process because the returned status
of the terminated child process isn't checked via a wait() */
system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal
}
else // executed by child process
{
exit(0); // the child process terminates immediately
}
return 0;
}
您可以通過Z +識別殭屍進程列表:
注意:如果您使用的是Windows,則必須修改代碼。
屬於superuser.com – 2010-10-04 17:46:18
@Paul R我不這麼認爲,這件事情是根據系統編程進行的。 – Searock 2010-10-04 17:54:30