天天看點

linux作業系統之程序 僵屍程序和孤兒程序

孤兒程序

孤兒程序: 父程序先于子程序結束,則子程序成為孤兒程序,子程序的父程序成為init程序,稱為init程序領養孤兒程序。

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>

int main()
{
        pid_t pid;

        pid = fork();

        if(pid==-1)
        {
                perror("fork:");
                exit(1);
        }
        else if(pid>0)
        {
                sleep(1);//
                printf("i am parant.\n");
        }
        else
        {

                printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
                sleep(3);
                printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
        }
        return 0;
    }
           

列印結果,發現父程序先結束,子程序後結束,子程序的父程序改變了。:

[[email protected] test2]# ./orphan

i am child.pid=423,ppid=422

i am parant.

[[email protected] test2]# i am child.pid=423,ppid=1

僵屍程序

僵屍程序: 程序終止,父程序尚未回收,子程序殘留資源(PCB)存放于核心中,變成僵屍(Zombie)程序。

【zoom .c】

特别注意,僵屍程序是不能使用kill指令清除掉的。因為kill指令隻是用來終止程序的,而僵屍程序已經終止。思考!用什麼辦法可清除掉僵屍程序呢?

設計一個僵屍程序:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid;
    pid =  fork();
    if(pid == -1)
    {
            perror("fork:");
            exit(1);
    }
    if(pid == 0)
    {
            printf("i am child .pid = %ld,ppid = %ld\n",getpid(),getppid());
            sleep(10);
            printf("child did.\n");
    }
    else if(pid > 0)
    {
            sleep(1);
            while(1)
            {
                   printf("i am parent. pid = %d,myson= %ld\n",getpid(),pid);
                   sleep(1);
            }
    }
    return 0;
           

}

列印結果,子程序已經運作結束,但父程序并沒有回收子程序。

[[email protected] test2]# ./zombie

i am child .pid = 482,ppid = 481

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

child did.

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

i am parent. pid = 481,myson= 482

……

繼續閱讀