Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1242035
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-12-30 16:51:55

进程退出时,有相应的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位表示)的。

阅读(4270) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~