闫刚 nuttx ps命令在全局变量和procfs实现的对比

资源

nuttx_ps_cmd.md

nuttx的ps命令实现原理

在没有添加proc虚拟文件系统实现方式

实现方法主要通过获取全局变量的值进行获取系统的状态,nuttx版本是NuttX-6.27

int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)   //ps命令
    ->sched_foreach(ps_task, vtbl);                              //遍历所有任务
        ->  nsh_output(vtbl, "%5d %3d %4s %7s%c%c %8s ",         //打印任务信息
             tcb->pid, tcb->sched_priority,
             tcb->flags & TCB_FLAG_ROUND_ROBIN ? "RR  " : "FIFO",
             g_ttypenames[(tcb->flags & TCB_FLAG_TTYPE_MASK) >> TCB_FLAG_TTYPE_SHIFT],
             tcb->flags & TCB_FLAG_NONCANCELABLE ? 'N' : ' ',
             tcb->flags & TCB_FLAG_CANCEL_PENDING ? 'P' : ' ',
             g_statenames[tcb->task_state]);

Nuttx的proc文件系统

proc是虚拟文件系统,是用户和内核交互的文件,可以通过操作proc文件系统的文件去获取系统信息,比如或者线程优先级
堆栈信息等

nsh命令中实现"ps"命令

下面是ps命令整个实现过程,主要是读取procfs文件系统下的文件,查看任务信息, Nuttx版本是NuttX-7.18

#ifndef CONFIG_NSH_DISABLE_PS
  { "ps",       cmd_ps,       1, 1, NULL },
#endif文档1: 

#ifndef CONFIG_NSH_DISABLE_PS
  { "ps",       cmd_ps,       1, 1, NULL },
#endif
nsh_proccmds.c:574:int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
  -> nsh_output(vtbl, "%s\n", "COMMAND");
  -> return nsh_foreach_direntry(vtbl, "ps", CONFIG_NSH_PROC_MOUNTPOINT,
                              ps_callback, NULL);
int nsh_foreach_direntry(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
                         FAR const char *dirpath,
                         nsh_direntry_handler_t handler, void *pvarg)
  -> dirp = opendir(dirpath); //打开文件系统	
 for (; ; )
  if (handler(vtbl, dirpath, entryp, pvarg) <  0) //类如ps_callback的命令,读取各个文件的内容

nsh_proccmds.c:574:int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)	

实现实例

Example
=======

  NuttShell (NSH) NuttX-6.31
  nsh> mount -t procfs /proc

  nsh> ls /proc
  /proc:
   0/
   1/

  nsh> ls /proc/1
  /proc/1:
   status
   cmdline

  nsh> cat /proc/1/status
  Name:       init
  Type:       Task
  State:      Running
  Priority:   100
  Scheduler:  SCHED_FIFO
  SigMask:    00000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值