今天分享一下僵尸进程和孤儿进程代码编写及atexit相关验证。
僵尸进程:子进程结束运行,但父进程依旧运行,还没有接受子进程的运行结果和释放子进程的PCB等资源,此时结束运行的子进程即处于僵尸状态(Z),同时子进程也被称作是僵尸进程。
僵尸进程:程序代码及运行结果截图
Zombie.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t id = fork();
if(id<0)//build wrong
{
printf("fork wrong");
return 1;
}
while(1)
{
if(id == 0)//child
{
printf("this pid:%d,ppid:%d\n", getpid(), getppid());
sleep(5);
exit(0);
}
else
{
printf("this pid:%d,ppid:%d\n", getpid(), getppid());
sleep(1);
}
}
return 0;
}
Makefile
run:zombie.c
gcc -o run zombie.c
.PHONY:clean
clean:
rm -f run
运行结果
孤儿进程:产生子进程的父进程提前结束了运行,而子进程依旧在运行中,此时的子进程被称为孤儿进程,子进程将会被init(1号)进程收养,并由init进程对孤儿进程的状态进行回收。
孤儿进程:程序代码及运行结果截图
orphan.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t id = fork();
if(id<0)//build wrong
{
printf("fork wrong");
return 1;
}
int i=0;
while(i<50)
{
if(id == 0)//child
{
printf("this pid:%d,ppid:%d\n", getpid(), getppid());
sleep(1);
i++;
}
else
{
printf("this pid:%d,ppid:%d\n", getpid(), getppid());
sleep(5);
exit(0);
}
}
return 0;
}
Makefile
run:orphan.c
gcc -o run orphan.c
.PHONY:clean
clean:
rm -f run
运行结果
atexit:终止进程,按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由main()函数或exit()函数自动调用。且atexit()注册的函数类型应为不接受任何参数的void函数。
1>下面我们来验证一下atexit()的功能。
代码截图
运行结果
首先由printf函数打印出”i have a pen!”,接下来因sleep(3)而睡3秒,接下来由于调用return 0,也会自动调用到atexit(fun1)函数,从而调用fun1函数而打印出”this is fun1”.
2> 如果同时调用好几个atexit()会发生些什么呢?
代码如下:
atexit.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void fun1(){
printf("this is fun1\n");
}
void fun2(){
printf("this is fun2\n");
}
void fun3(){
printf("this is fun3\n");
}
int main()
{
atexit(fun1);
atexit(fun2);
atexit(fun3);
printf("i have a pen!\n");
sleep(3);
exit(0);
}
Makefile
run:atexit.c
gcc -o run atexit.c
.PHONY:clean
clean:
rm -f run
运行结果
首先由printf函数打印出”i have a pen!”,接下来因sleep(3)而睡3秒,接下来由于调用exit(0),也会依次调用离exit(0)近的atexit(),所以依次调用atexit(fun3)、atexit(fun2)、atexit(fun1)函数,从而依次自动调用fun3、fun2、fun1函数从而依次打印出”this is fun3”、”this is fun2”.、”this is fun1”.
此次分享如下,希望共同进步,不要生病。
ps:生病真的很难受,千万不要生病。T_T