【Linux】进程等待

目录

一、进程终止

1.1 程序正常终止

1.2 程序异常终止

1.3 exit和_exit

二、进程等待

2.1 进程等待的方法

(1)wait

(2)waitpid

2.2 获取子进程退出状态


一、进程终止

一个进程在退出的时候,有以下三种情况:

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

1.1 程序正常终止

我们可以通过在main函数中return、调用exit或_exit函数让一个进程正常终止,进程正常结束后会返回一个退出码。不同的退出码可以代表不同的错误原因,用于告诉用户程序是否发生错误、发生了什么错误。

例如return 0就是返回一个为0的退出码,表示程序成功运行

我们可以通过 echo $? 命令来查看上个进程的退出码,例如:

#include <stdio.h>

int main()
{
    return 12;
}     

这个程序将会返回退出码12,我们运行该程序后输入上面的命令

问题来了:我怎么知道有哪些退出码,什么退出码又对应哪些错误原因呢?

我们可以用strerror函数来观察,向该函数传入退出码后会返回该退出码对应的错误信息

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    for(int i = 0;i < 200;i++)
    {
        printf("%d: %s\n", i, strerror(i));
    }
    return 0;                                                                                                                                                                                                 
}                       

1.2 程序异常终止

有时候运行代码时会遇到一些严重错误导致程序异常终止,此时我们就不用关心退出码了

就好比你考试考差了,原因是身体不舒服。但是如果你作弊,直接无法完成考试,别人也不会关心其他的原因了。所以如果程序异常终止或运行结果不正确,我们都要先检查是否出现异常,再检查退出码

程序发生异常后,对应的异常会被系统转化为信号的形式发送给父进程

在程序中将一个变量除以0,或者使用野指针都会导致异常。我们可以尝试一下:

可以看到除0错误在编译时就已经出现了警告,运行程序后直接发生Floating point exception即浮点数溢出的异常

而野指针错误在编译时虽然不会发出警告,但是运行程序后也会发生Segmentation fault即段错误的异常

实际上,每种异常也都有自己的编号,我们可以使用命令 kill -l 来查看

其中Floating point exception对应的编号为8,Segmentation fault对应的编号为11

我们甚至

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值