uname是怎么执行的?
随手在键盘敲击一个uname -a,系统信息就出来了:
Linux My 2.6.8-2-686-smp #1 SMP Tue Aug 16 12:08:30 UTC 2005 i686 unknown unknown GNU/Linux
可是执行该命令时,系统究竟做了什么?如果查阅coreutils的uname.c文件就会发现其实uname使用了一个系统调用sys_uname:
asmlinkage int sys_uname(struct old_utsname __user * name)
{   
    ...
    err=copy_to_user(name, &system_utsname, sizeof (*name));
    ...
}
name作为传出参数接受内核的返回,可见系统通过保存一个静态的变量system_utsname来支援uname系统调用,我们看一下最重要的结构体:
struct utsname {
    char sysname[];
    char nodename[];
    char release[];
    char version[];
    char machine[];
#ifdef _GNU_SOURCE
    char domainname[];
#endif
};
从每个字段的名字可以看出uname支持的选项,-s,-n,-r,-v,-m,-a(--all),从上面uname -a的输出也可以看出输出信息分为5个段。最后看一下系统保留的那个静态结构体,作为系统调用uname的结果:
struct new_utsname system_utsname = {
    .sysname    = UTS_SYSNAME,
    .nodename    = UTS_NODENAME,  /* set by sethostname() */
    .release    = UTS_RELEASE,
    .version    = UTS_VERSION,
    .machine    = UTS_MACHINE,
    .domainname    = UTS_DOMAINNAME, /* set by setdomainname() */
};
who/users等命令是怎么执行的?
who/users命令使用了一个文件,在我的系统上,它的全路径是:/var/run/utmp,该文件中保存了一个下列结构体的数组:
struct utmp {
    ...          
};
这个文件既然保存了一个结构体数组,因此也就不要指望可以将该文件作为文本文件来读取了,虽然它也不是可以要做成二进制的。如果想解析该文件,那么必须逐数组元素逐字段地解析,下面的函数是解析流程:
int read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf)
{
    FILE *utmp;
    struct stat file_stats;
    size_t n_read;
    size_t size;
    STRUCT_UTMP *buf;
    utmp = fopen (filename, "r");
    fstat (fileno (utmp), &file_stats);
    size = file_stats.st_size;
    buf = (STRUCT_UTMP *) xmalloc (size);
    n_read = fread (buf, 1, size, utmp);
    *n_entries = size / sizeof (STRUCT_UTMP);
    *utmp_buf = buf;
    return 0;
}
命令who的执行过程不外乎就是:
static void who (const char *filename)
{
    int n_users;
    STRUCT_UTMP *utmp_buf;
    int fail = read_utmp (filename, &n_users, &utmp_buf);
    if (short_list)
        list_entries_who (n_users, utmp_buf); //实现一个循环来读取utmp_buf中的各个元素的ut_name字段
    else
        scan_entries (n_users, utmp_buf); //循环读取每个元素的各个字段
}
tty命令是怎么执行的?
在任意终端输入tty命令,得到的是诸如/dev/ttyn,/dev/pts/n之类的输出,这是怎么回事?看一下coreutils的tty.c的源代码之后就会发现实际上tty调用了一个叫做ttyname的函数,实际上就是取得标准输入,也就是文件描述符0所对应的设备文件,如下:
KOAL-ECCDEV-01:~/coreutils/coreutils-5.0/src# tty
/dev/pts/0
如果将标准输入重定向到一个普通文件:
KOAL-ECCDEV-01:~/coreutils/coreutils-5.0/src# tty 0>aaa
not a tty
说明ttyname正如man手册描述的那样,会检查终端设备的正确性,如果在/dev/pts/0上执行下面的:
KOAL-ECCDEV-01:~/coreutils/coreutils-5.0/src# tty 0>/proc/25542/fd/0 #25542为pts/1的ping 127.0.0.1
/dev/pts/1

可见输出的是别的终端,其实只要在/dev/pts/n上执行tty 0 > /dev/pts/m(m!=n)即可

本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271816

coreutils-5.0中几个命令的执行过程相关推荐

  1. 在 Shell 脚本中跟踪调试命令的执行

    文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...

  2. cp oracle,Oracle ASM使用asmcmd中的cp命令来执行远程复制

    Oracle ASM使用asmcmd中的cp命令来执行远程复制 cp命令的语法如下: cp src_file [--target target_type] [--service service_nam ...

  3. Linux 命令的执行过程/Shell提示符/alias命令

    在 Linux 系统中"一切皆文件",Linux 命令也不例外.那么,当编辑完成 Linux 命令并回车后,系统底层是怎么执行的? 1) 内核层 内核层是 UNIX/Linux 系 ...

  4. 使用SystemTap分析lvextend命令的执行过程

    使用SystemTap分析lvextend命令的执行过程 1)在SUSE12sp3系统上安装systemstap工具,lvm的debuginfo和debugsource对应的rpm包. 2)准备测试用 ...

  5. mysql中一条update的执行过程

    一.Server层阶段: 连接器:负责跟客户端建立连接.获取权限.维持和管理连接 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 优化器:选择索引,生成执行计划. 执行器:根据优 ...

  6. 设置linux查看历史命令显示两个小时内,linux系统中history历史命令显示执行日期和时间...

    在我们日常维护工作中,history历史命令查看是经常会用到的,特别是系统出了问题,肯定会在第一时间要查看之前都执行过什么命令,但是系统默认的history命令列表中是不显示命令执行时间和日期的,这就 ...

  7. 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 二.解决方案 查看 7zip 软件的安装路径 E:\Program Files\7-Zip , 其中 7z.exe 和 7z.dll 就是执行所需的 ...

  8. alias中后面的命令不执行的问题(没有解决 )

    alias startmeta="hive --service metastore&&hiveserver2 &" 其中&&表示,前面一句命 ...

  9. Tuscany SCA V1.0中的扩展机制和启动过程中的扩展点[11月29日更新]

    2007年9月24日Tuscany SCA 发布了V1.0版本的实现 .本文讲述的内容使用的就是基于这个版本的,代码下载地址 http://incubator.apache.org/tuscany/s ...

最新文章

  1. 一个算法对于某个输入的循环次数是可以事先估计出来的_数据结构与算法:算法...
  2. vuex保存用户信息_你想要的,vuex干货分享
  3. C++False position求根的实现算法(附完整源码)
  4. 消息中间件的发展过程
  5. 1215 - Cannot add foreign key constraint
  6. Mysql修改字段名和长度_mysql中修改表字段名/字段长度/字段类型详解
  7. 6a标准 api_机油最新最高标准来了!SN不再是最高标准!车主不要加错机油了!...
  8. 新房装修,家里WiFi怎么弄?
  9. 【VB】StrConv函数.
  10. 递归实现排列型枚举(搜索)
  11. 微信小程序教程笔记6
  12. 一条SQL语句在MySQL中执行过程全解析
  13. SpringBoot:EasyExcel动态字段(不创建对象)多sheet、多文件|压缩包格式导出
  14. BZOJ3786: 星系探索(伪ETT)
  15. c语言自己走时间的程序,c语言用哪些语句能实现时间暂停?比方说按某一个键使时间暂停,再按一次使时间继续。...
  16. canvas快速入门(三)canvas实现笔触绘画案例
  17. 关于条件编译和预编译的一点学习心得
  18. 【蓝桥杯】历届试题 数字游戏(C++)
  19. WAVEFORMATEX 格式说明
  20. [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)

热门文章

  1. Eclipse安装SVN教程
  2. ALM11需求和测试覆盖率图解1
  3. linux开机流程、模块管理与Loader(续)
  4. Android - HttpURLConnection 抛出异常
  5. rhcs做HA时的资源释放脚本实现
  6. 鸟哥的Linux私房菜基础学习篇(第二版)第十二章课后习题与答案
  7. 在应用程序中宿主MEF
  8. php 消息中间件,消息中间件NMQ
  9. python里面map函数_python中的map()函数
  10. Android图片缓存框架Glide