一. 进程的基本概念:
1. 程序的一个执行实例,正在执行的程序;
2. 担当分配系统资源的实体;
二.进程创建,等待和终止:
1.进程的创建:
fork函数:在Linux中fork函数是非常重要的,他从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
fork函数原型:
#include<unistd,h>
pid_t fork(void);
返回值:子进程中返回0,父进程返回子进程的pid,出错返回-1
fork函数的执行逻辑:
分配新的内存块和内核数据结构给子进程;
将父进程部分数据结构内容拷贝给子进程;
添加子进程到系统列表中;
fork返回,开始调度器调度;
int main(void)
{
pid_t pid;
printf("before:pid id %d\n", getpid());
if((pid = fork()) == -1)
perror("fork()"),exit(1);
printf("after: pid is %d,fork return %d\n",getpid(),pid);
sleep(1);
return 0;
}
fork函数调用失败的原因:
系统中有太多的进程;
实际用户的进程数超过了限制;
vfork函数:
用于创建一个子进程,而子进程和父进程共享地址空间,fork的子进程具有独立地址空间;
保证子进程先运行,在它调用exec之后父进程才可能被调运行;
int glob = 100;
int main(void)
{
pid_t pid;
if((pid = vfork()) == -1)
perror("fork"),exit(1);
if(pid == 0)
{
sleep(5);
glob = 200;
printf("child glob %d\n", glob);
exit(0);
}
else
{
printf("parent glob %d\n", glob);
}
return 0;
}
2.进程的等待:
进程等待的必要性:
子进程退出,父进程不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏;
进程一旦变成僵尸状态,就算 kill -9爷无能为力,因为谁也没办法杀死一个已经死去的进程;
子进程运行完成的结果对还是不对,或者是否正常退出;
父进程通过进程等待的方式,回收子进程资源,获取子进程推出信息;
进程等待的方法:
wait方法:
#include<types.h>
#include<wait.h>
pid_t wait(int *status);
返回值:成功返回被等待进程pid,失败返回-1;
参数:输出型参数,获取子进程退出状态;
waitpid方法:
pid_t waitpid(pid_t pid,int *status,int options);
3.进程终止:
进程退出的场景:
代码运行完毕,结果正确;
代码运行完毕,结果不正确;
代码异常终止;
正常终止(可以通过echo $?查看进程退出码):
从main函数返回;
调用exit;
-exit;
异常退出:
ctrl + c,信号终止;
exit函数:
#include<unsitd,h>
void exit(int status);
_exit函数:
#include<unistd.h>
void _exit(int status);
参数:status 定义了进程的终止状态,父进程通过wait来获取值
实例:
int main()
{
printf("hello");
exit(0);
}
int main()
{
pintf("hello");
_exit(0);
}