Unix/Linux 编程实践教程第三章习题

tips: 答案仅供参考,不保证正确

3.1

在我的 deepin 上,d_name 的长度是 256,有的系统定义成 1 是为了节省空间,使用时可以通过 malloc() 动态的分配空间,比如:

struct dirent
{
   int len;
   char a[0];
};

struct dirent *fun(char *str, int len)
{
   struct dirent* n = (struct dirent*)malloc(len +1 + sizeof(struct dirent));
   if (!n)
      return NULL;
   n->len = len;
   memcpy(n->a, str, len);
   return n;
}

扩展了 dirent 后,多出来的空间在 struct 的尾部,可以通过 char a[0] 直接访问。这里使用的 char a[0] 相比于 char a[1] 更值得推荐,不会增加结构的 size,如果不需要可以不占用内存,此外 C99 之前 a 的长度必须是 1。定义成 char * 也可以,不过指针占用 sizeof(char *) 个字节,而且指针在申请空间之后需要初始化。

3.2

经过实验,root 用户可以读

3.3

不会

3.4

为目录设置set-group-ID位目的是方便团队合作。举个例子,user_one 的主组为 group_one,附加组为 group_two,有一个目录 directory 的所属组是 group_two,user_one 在 directory 中创建了一个新文件 file_one,如果不为 directory 目录设置 set_group_ID 位,file_one 的所属组将为 group_one,为了把它的所属组改为 group_two,需要执行 chgrp 命令,这样无疑是繁琐的。在为 directory 设置了 set_group_ID 位后,user_one 新创建的文件的所属组将直接是 group_two。

3.5

实验后的结论:一个纯文本文件具有可执行权限也不可以执行,可执行文件没有可执行权限也不可以执行。file 命令可以显示文件的类型,如 textexecutabledata

3.6

让用户在使用的时候记住自己的用户 id 显然是不合理的,可以类比域名和 IP 地址的关系,相比于 IP 地址,域名明显更好记,用户名和用户 id 也一样。如果使用名户名来标识文件所有者,用户可一旦想要更改自己的用户名,那么就要把所有文件的信息都更新一遍,显然是不合理的,而且用户名可能会重复,这样也就起不到标识的作用,对于计算机而言,使用用户 id 节省空间,对于用户而言,使用用户名简单好记,缺一不可。

3.7

getdents用于批量的读取目录项,有三个参数,第一个参数是目录的文件描述符,第二个参数是一个 buffer,用于存放读取的数据,第三个参数是 buffer 的大小。阅读 getdents 的源代码发现其调用了 vfs_readdir 函数,该函数又调用了 readdir 函数。

3.8

通过命令

chmod u=rw ./test

更改权限后发现 test 文件夹下的所有文件和目录无法访问,Linux 下,目录也是一种文件,目录的可执行权限不是是否可以执行,而是是否能够进入目录。一个只读权限的目录不运行 CD进入目录,一个只有执行权限的目录可以进入但是不能看到目录下的内容。

3.9

要获取 login 的源代码,首先通过

which loign

获取 login 命令的位置,然后通过

dpkg -S /usr/bin/login 

获取其源代码所在的包,最后通过

apt-get login

下载 login 的源代码,其中改变终端文件所有者的函数大概可能也许是 setup_tty

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thewangcj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值