当当当当~~,你是不是好奇什么是进程呢?这篇文章带你了解了解什么是进程,及其进程相关知识。
1. 什么是进程
- 从操作系统角度分析,进程是一个运行中程序描述 —— PCB(进程控制块)。
【查看进程】
ps -ef (查看所有进程信息) / aux (信息更详细)
pid_t getpid(void) //获取调用进程的ID
2. 进程的状态
- 运行、就绪、阻塞;
- linux下的状态有:运行状态R / 可中断休眠状态S / 不可中断休眠状态D / 停止状态T / 死亡状态X / 追踪状态t / 僵尸状态Z。
【什么是僵尸进程】
- 僵尸状态:进程已经退出,但是资源没有完全释放;
- 僵尸进程:处于僵尸状态的进程;
- 僵尸进程的产生:子进程先于父进程退出,为了保存退出的原因,资源并没有完全被释放。父进程没有关注子进程退出状态,则子进程成为僵尸进程。
3. 进程创建
pid_t fork(void) -> 通过复制父进程,创建子进程
返回值:
-1:创建子进程失败
=0:对于子进程,返回值时0
>0:对于父进程,返回值是子进程的pid
pid_t pid = fork(); //创建一个子进程
if (pid < 0)
{
perror("fork error"); //出错
return -1;
}
else if (pid == 0)//子进程
{
sleep(3);
exit(0); //僵尸进程->子进程先于父进程退出
}
4. 进程终止
- 进程的终止场景:异常退出;正常退出,结果符合预期;正常退出,结果不预期。
//获取一个系统调用的错误信息
void perror(char *msg)
char *strerror(int errno)
【如何终止一个进程】
- 在main函数中return;
- 在任意地方调用exit(int statu)接口----库函数接口----退出前都会刷新缓冲区;
- 在任意地方调用_exit(int statu)接口----系统调用接口----退出时会直接释放所有资源。
int main()
{
printf("今天有些小糟糕!");
sleep(3);
_exit(0); //_exit:直接退出,释放所有资源
exit(0); //exit:退出刷新缓冲区
return 0; // return:退出进程时,刷新缓冲区,把缓冲区文件写到文件中
}
5. 进程等待
int wait(int *statu); --阻塞接口--等待任意一个子进程退出,若没有子进程退出,则一直等待子进程的返回值会放到传入的参数statu中。
int main()
{
pid_t pid = fork(); //创建一个子进程
if (pid < 0)
{
perror("fork error");
return -1;
}
else if (pid == 0)
{
sleep(3);
exit(0); //僵尸进程
}
wait(NULL);
while(1)//死循环
{
printf("------\n");
sleep(1);
}
return 0;
}
pid_t waitpid(pid_t pid, int *status, int options);
1. 可以的等待指定pid的子进程退出;
2. status:返回值;
3. options 若被指定为 WNOHANG ,则将waitpid设置为非阻塞;
4. pid:-1:表示等待任意一个子进程;
>0:表示等待指定pid的子进程;
5.返回值:
>0:返回的是退出子进程的pid;
=0:没有子进程退出;
<0:等待错误;
6. 进程替换
- 替换一个进程正在运行的程序。
exec函数族:
l:
int execl(const char *path, const char *arg, ...); //path:一个可执行程序文件的路径名; *arg, ...:运行参数
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
v:
int execv(const char *path, char *argv[]);
int execvp(const char *file, char *argv[]);
int execve(const char *file, char *argv[], char *const envp[]);
execl("/bin/ls", "ls", "-l", "-a", NULL);//“ls”运行参数
【附录】
【注意】以上呐,简单对进程进行梳理,若有不足之处,请指出。