进程的创建:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("%d\n",getpid());//getpid()获取调用进程的ID
pid_t pid = fork();
printf("---------------------------\n");
printf("123\n");
printf("456\n");
printf("%d\n",pid);
printf("---------------------------\n");
return 0;
}
以上述代码为例:
pid_t pid = fork()
pid_t其实就是一个int类型的变量,用来表示进程的ID,fork()返回一个进程ID,这个进程ID赋值给pid
这个语句复制调用进程(父进程),创建了一个新的进程(子进程)
父进程在创建子进程成功后,程序计数器走到创建子进程的下一步指令,因此子进程是在fork创建子进程成功后开始调用
fork()的返回值:对于父进程来说:返回的是子进程的ID,是大于0的
对于子进程来说:返回的都是0
gitpid()获取调用进程的ID

根据fork()的返回值不同,进行判断可以实现父子进程代码分流
查看进程信息: ps -ef 或者 ps -aux
进程的状态:
进程的状态有三类:就绪,运行,阻塞
linux下进程的状态:
可执行状态(R):正在运行/只要拿到时间片就可以运行 -----这种进程调度到CPU上进行处理
可中断休眠状态(S):当前处于休眠状态,这种休眠可以被打断
不可中断休眠状态(D):当前处于休眠状态,这种休眠不可以被打断
停止状态(T):什么事都不干
退出状态 -->进程成为僵尸进程(Z):进程已经退出,但是资源没有完全释放是处于的一种状态,等待后续的处理
这里只是简单的介绍一下各种状态,想要详细了解可以在我的博客中查阅 进程的状态
僵尸进程:
处于退出状态,但是资源没有资源没有完全的释放,等待父进程“收尸”
危害:资源泄露 :用户能创建的进程是有限的,僵尸进程过多会导致创建新的子进程的失败从而导致不可预估后果!!
内核资源:内核中的PCB没有被 回收
产生:给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取。这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间,内存 使用量等等)。如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的 init进程将清理它们(init进程将wait它们,从而去除僵尸状态)。
之所以产生僵尸进程是因为子进程先于父进程退出,而父进程没有获取维护子进程的信息,则该子进程就成为僵尸进程。
避免:父进程一直等待子进程的退出
本文详细介绍了如何使用C语言创建进程,通过fork()函数复制父进程并创建子进程,以及如何通过返回值判断进程类型。同时,讲解了如何利用getpid()获取进程ID,以及进程在Linux下的各种状态,如可执行状态、休眠状态等。此外,还深入探讨了僵尸进程的危害和避免方法。

1147

被折叠的 条评论
为什么被折叠?



