子进程和父进程
子进程和父进程是各种独立的进程,采用的是抢占式进程调度,运行的代码是相同的
子进程由unistd.h头文件里的fork()函数创建,fork函数会返回两个值,一个是返回子进程的pid给父进程,另一个是返回0给子进程,pid为进程号,ppid为父进程号
在Linux中用ps aux | grep xxx指令来查询进程的进程号及状态,启动指令的进程由bash创建
进程状态常见的有R、R+、t、T、Z、S、X、D等
#include <stdio.h>
#include <unistd.h>
int main()
{
int ret = fork();
while(1)
{
if(ret == 0)
{
printf("i am child, pid is %d, ppid is %d\n", getpid(), getppid());
}
else
printf("i am father, pid is %d\n", getpid());
sleep(1);
}
return 0;
}
孤儿进程
若父进程在子进程前结束,则子进程会变成孤儿进程,并在结束时被1号进程回收资源,防止变成僵尸进程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
//在命令行当中输入的程序启动命令启动的进程是由bash创建出来的
//父进程在子进程前退出,子进程就会变为孤儿进程被pid为1的init进程收养
int main()
{
pid_t ret = fork();
if(ret < 0)
{
perror("fork()");
return 0;
}
else if(ret == 0)
{
printf("i am child, pid is %d\n", getpid());
sleep(10);
}
else
{
printf("i am father, pid is %d\n", getpid());
sleep(3);
exit(0);
}
//孤儿进程并没有危害,在孤儿进程退出后被1号进程回收资源,防止变成僵尸进程
return 0;
}
僵尸进程
#include <stdio.h>
#include <unistd.h>
//子进程先于父进程退出,子进程会变成僵尸进程
int main()
{
pid_t ret = fork();
if(ret < 0)
{
perror("fork");
return 0;
}
else if(ret == 0)
{
printf("i am child, pid is %d, ppid is %d\n", getpid(), getppid());
}
else
{
while(1)
{
printf("i am father\n");
sleep(1);
}
}
}