coreutils-5.0中几个命令的执行过程

来源:互联网 发布:淘宝客贷在哪 编辑:程序博客网 时间:2024/05/16 17:56

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)即可

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 舌头上有锯齿印怎么办 夏天有脚气脚臭怎么办 xp分辨率太高黑屏怎么办 农村淘宝标识类目没了怎么办 被投诉到食品监督局怎么办 被客户315投诉了怎么办 给人打不接受调解怎么办 失业证年审忘了怎么办 工商年检过期4天怎么办 个体营业执照年审过期了怎么办 企业年报密码忘了怎么办 税务年报报错了怎么办 工商证过期5年怎么办 车年检标志丢了怎么办 年检标志打错了怎么办 贵州个体出租车工商执照年检怎么办 驾驶证考试预约提示网络繁忙怎么办 帝豪显示屏花屏怎么办 注册公司居委会不盖章怎么办 营业执照名字和店名不一样怎么办 开炸鸡店没经验怎么办 提名候选人时重名重姓怎么办 别人用我的店名怎么办 wish店铺出现侵权产品怎么办 如果公司缺人该怎么办 鲁班奖证书丢了怎么办 个人注册服务号没有营业执照怎么办 社保过了缴费日怎么办 被评为d级纳税人怎么办 忘了税号tfn怎么办 个体户没有办税务登记怎么办 遇征地企业不搬怎么办 dnf账号改错名了怎么办 银行卡绑定的手机号码换了怎么办 支付宝手机号码换了怎么办 淘宝账号被注销了怎么办 注销淘宝号绑定的手机号怎么办 淘宝账号不小心注销了怎么办 淘宝旧密码忘了怎么办 淘宝登录原始密码忘记了怎么办 微信原始密码忘记了怎么办