【linux进程】进程终止进程等待
目录
- 一,进程终止
- 1. 终止是在做什么
- 2. 查看退出码和错误信息
- 3. 三种退出场景的理解
- 4. 如何终止
- 二,进程等待
- 1. 进程等待必要性
- 2. 进程等待的方法
- 1. wait 函数
- 2. waitpid 函数
一,进程终止
1. 终止是在做什么
2. 查看退出码和错误信息
查看进程的退出码,
使用指令:echo $?
退出码可以自定义,一般而言,退出码为0表示正常退出,非0时表示代码运行正常,但是可能结果错误,这些非0值都有对应的错误描述:
使用man手册查看strerror函数:
代码演示:
3. 三种退出场景的理解
进程退出场景:
1. 代码运行完毕,结果正确
2. 代码运行完毕,结果不正确
3. 代码异常终止
结论:
衡量一个进程退出,我们只需要两个数字:退出码,退出信号!
4. 如何终止
进程常见退出方法:
正常终止
1. 从main返回
2. 调用exit
3. _exit
异常退出:
ctrl + c,信号终止
1. 参数:status 定义了进程的终止状态,父进程通过wait来获取该值
2. return 是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。
二,进程等待
1. 进程等待必要性
2. 进程等待的方法
1. wait 函数
代码演示:
2. waitpid 函数
下面对这个函数的三个参数进行解释和使用:
1. 演示第二个参数status:
修改上面的代码,改成死循环,验证不同的退出码和退出信号:
2. 演示status里的几个宏:
3.演示第三个参数option:
代码演示:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
void childRun()
{
int cnt = 5;
while(cnt--)
{
printf("I am a child process, pid: %d, ppid: %d\n", getpid(), getppid());
sleep(2);
}
}
int main()
{
printf("father process is running... pid: %d, ppid: %d\n", getpid(), getppid());
pid_t id = fork();
if(id == 0)
{
// child
childRun();
printf("child process is running, pid: %d, ppid: %d\n", getpid(), getppid());
sleep(2);
exit(123);
}
// father
// 通过循环,进行非阻塞轮询
while(1)
{
int status = 0;
pid_t rid = waitpid(id, &status, WNOHANG);
if(rid == 0)
{
printf("child process not quit, check next time!\n");
}
else if(rid > 0)
{
// 已经等待成功了,检测一下退出情况
if(WIFEXITED(status))
printf("child quit success! child exit code: %d\n", WEXITSTATUS(status));
else
printf("child quit unnormal!\n");
break;
}
else
{
// 等待失败
printf("wait failed!\n");
break;
}
}
return 0;
}
部分截图: