行业知识
【Linux学习】深入探索进程等待与进程退出码和退出信号
2026-10-26 14:42:00
来源:互联网转载
文章目录
- 退出码
- return退出
- 进程的等待
- 进程等待的方法
退出码
main函数的返回值:进程的退出码。
一般为0表示成功,非0表示失败。
每一个非0退出码都表示一个失败的原因;
echo $?命令
作用:查看进程退出码。(最近一次进程退出时的退出码)
查看进程的退出码对应的错误描述:
- 使用系统自带函数:strerror
作用:将一个错误吗转化为错误描述。
示例:
测试代码:
#include #include #include #include int main() { for(int i =0 ;i printf("%d: %s\n",i,strerror(i)); } return 0; } success=0, Operation_not_permitted, No_such_file_or_directory }; const char* errorstr(int error) { switch(error) { case success: return "success"; case Operation_not_permitted: return "Operation not permitted"; case No_such_file_or_directory: return "No such file or directory"; default: return "unkown"; } }FILE* fp = fopen("./c.txt","r");printf("%d:%s\n",errno,strerror(errno));return 0;}printf("hello linux");sleep(2);exit(1);return 0;} pid_t id = fork(); if(id==0) { //子进程 int cnt = 2; while(cnt--) { printf("child pid:%d ppid: %d\n",getpid(),getppid()); sleep(1); } printf("子进程准备退出\n"); exit(0); } //fatherprintf("父进程休眠\n");sleep(4); printf("父进程回收僵尸进程\n"); pid_t rid = wait(NULL); if(rid0) { printf("等待成功,僵尸进程 id:%d\n",rid); }printf("父进程回收成功\n");sleep(2); return 0; }运行结果:fork之后,父子进程谁最先运行?不确定。
谁最后退出,父进程。
- waitpid的使用
返回值:
- 当正常返回的时候waitpid返回收集到的子进程的进程ID;
- 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
- 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:pid
- Pid=-1,等待任一个子进程。与wait等效。
- Pid>0.等待其进程ID与pid相等的子进程。
如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
如果不存在该子进程,则立即出错返回。
测试代码:
9 int main() 10 { 11 pid_t id = fork(); 12 if(id==0) 13 { 14 //子进程 15 int cnt = 2; 16 while(cnt--) 17 { 18 printf("child is running pid:%d ppid: %d\n",getpid(),getppid()); 19 sleep(1); 20 } 21 printf("子进程准备退出\n"); 22 exit(1); 23 } 24 int status = 0; 25 pid_t rid = waitpid(id,&status,0); 26 if(rid>0){ 27 printf("等待成功,僵尸进程 id:%d status:%d\n",rid,status); 28 } 29 sleep(2); 30 31 return 0; 32 }运行结果:
分析:退出码为1,这里为什么是256呢?
根据下面对status存储的解释:上面的status等于:
0000 0000 0000 0000 0000 0001 0000 0000 = 2^8 = 256
获取子进程status
wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
如果传递NULL,表示不关心子进程的退出状态信息。
否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。
status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特位):
- 使用系统自带函数:strerror
- 进程等待的方法
上一篇:服务器怎么给别人打钱?
下一篇:银行卡怎么绑定服务器?