Linux kernel 3.10内核源码分析--进程退出exit_code

进程退出时,有相应的exit_code,可用于判断进程退出的原因。
比如,waitpid()接口用于等待进程退出,此时被等待退出的进程的返回值比较重要,需要用其来判断进程退出的相应状态,而这就是通过进程退出时的exit_code来获取的。waitpid()库函数接口定义如下:
pid_t waitpid(pid_t pid, int * status, int options);
其中status用于保存被wait进程的退出状态值,其实就是exit_code,相关实现代码如下:

点击(此处)折叠或打开

  1. SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
  2. {
  3. return sys_wait4(pid, stat_addr, options, NULL);
  4. }

点击(此处)折叠或打开

  1. /*sys_waitpid()和sys_wait4系统调用的实现*/
  2. SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
  3.         int, options, struct rusage __user *, ru)
  4. {
  5.     struct wait_opts wo;
  6.     struct pid *pid = NULL;
  7.     enum pid_type type;
  8.     long ret;

  9.     if (options & ~(WNOHANG|WUNTRACED|WCONTINUED|
  10.             __WNOTHREAD|__WCLONE|__WALL))
  11.         return -EINVAL;

  12.     if (upid == -1)
  13.         type = PIDTYPE_MAX;
  14.     else if (upid < 0) {
  15.         type = PIDTYPE_PGID;
  16.         pid = find_get_pid(-upid);
  17.     } else if (upid == 0) {
  18.         type = PIDTYPE_PGID;
  19.         pid = get_task_pid(current, PIDTYPE_PGID);
  20.     } else /* upid > 0 */ {
  21.         type = PIDTYPE_PID;
  22.         pid = find_get_pid(upid);
  23.     }

  24.     wo.wo_type    = type;
  25.     wo.wo_pid    = pid;
  26.     wo.wo_flags    = options | WEXITED;
  27.     wo.wo_info    = NULL;
  28.     wo.wo_stat    = stat_addr;
  29.     wo.wo_rusage    = ru;
  30.     ret = do_wait(&wo);
  31.     put_pid(pid);

  32.     return ret;
  33. }
do_wait()->
  do_wait_thread()->
      wait_consider_task->
        wait_task_zombie
         wait_task_stopped
         wait_task_continued


点击(此处)折叠或打开

  1. /*sys_wait4和sys_waitpid的实现for task in state EXIT_ZOMBIE*/
  2. static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
  3. {
  4.    ...
  5.         status = (p->signal->flags & SIGNAL_GROUP_EXIT)
  6.         ? p->signal->group_exit_code : p->exit_code;
  7.     if (!retval && wo->wo_stat)
  8.         retval = put_user(status, wo->wo_stat);
  9. ...
  10. }
其中,p->exit_code,即被wait进程的exit_code,其值有两种情况:
1、由用户态exit()接口传入,此时的exit_code=用户态传入的error_code<<8,相应代码如下:

点击(此处)折叠或打开

  1. SYSCALL_DEFINE1(exit, int, error_code)
  2. {
  3.     do_exit((error_code&0xff)<<8);
  4. }

2、内核中直接调用do_exit()时作为入参传入的错误码,此时的错误应该都是小于255(低8位表示)的。


原文地址: http://blog.chinaunix.net/uid-14528823-id-4729703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值