小工具知识网

当前位置: 首页 > 行业知识 > 【Linux学习】深入探索进程等待与进程退出码和退出信号

行业知识

【Linux学习】深入探索进程等待与进程退出码和退出信号

2026-10-26 14:42:00 来源:互联网转载

文章目录

  • 退出码
    • return退出
    • 进程的等待
      • 进程等待的方法

        退出码

        main函数的返回值:进程的退出码。

        一般为0表示成功,非0表示失败。

        每一个非0退出码都表示一个失败的原因;

        echo $?命令

        作用:查看进程退出码。(最近一次进程退出时的退出码)

        查看进程的退出码对应的错误描述:

        1. 使用系统自带函数: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之后,父子进程谁最先运行?不确定。

        谁最后退出,父进程。

        1. 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比特位):


上一篇:服务器怎么给别人打钱?

下一篇:银行卡怎么绑定服务器?