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

tips: 如果使用 man 查询是出现问题可能是你的 Linux 发行版没有完整的 man pages,可以通过下面的命令安装:

sudo apt install manpages
sudo apt install manpages-dev

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

2.1

相比于 who 命令, w 还提供了当前时间、系统运行时间、有多少登录用户以及过去1,5和15分钟的系统负载平均值。
接下来的每一行还提供了 idle time、JCPU、PCPU 以及当前进程的位置。其中 JCPU 是由连接到 TTY 所有进程使用的时间。它不包括过去的后台任务,但包括当前正在运行的后台任务。PCPU 是 what 字段表示的进程使用的时间。这些信息来自与 var/run/utmpproc

2.2

查阅了一下 man,描述如下:Furthermore, the terminal name ~ with username shutdown or reboot indicates a system shutdown or reboot and the pair of terminal names |/} logs the old/new system time when date(1) changes it. wtmp is maintained by login(1), init(1), and some versions of getty(8) (e.g., mingetty(8) or agetty(8)). None of these programs creates the file, so if it is removed, record-keeping is turned off.

2.3

执行

cp who0.c /dev/tty

此时屏幕上会显示 who0.c 的内容,然后执行

cp /dev/tty test

在终端输入字符,按下 Ctrl+D 结束输入,输入的内容全部都在 test 文件中。

2.4

在我的 deepin 上,FILEstdio.h 中定义为

typedef struct _IO_FILE FILE; 

_IO_FILElibio.h 中定义为

struct _IO_FILE {
  int _flags
  char* _IO_read_ptr;	/* Current read pointer */
  char* _IO_read_end;	/* End of get area. */
  char* _IO_read_base;	/* Start of putback+get area. */
  char* _IO_write_base;	/* Start of put area. */
  char* _IO_write_ptr;	/* Current put pointer. */
  char* _IO_write_end;	/* End of put area. */
  char* _IO_buf_base;	/* Start of reserve area. */
  char* _IO_buf_end;	/* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

其中 _IO_buf_base_IO_buf_end 类似于 utmplib.c 中的 utmpbuf_IO_read_ptr 类似于 cur_rec_IO_read_ptr 减去 _IO_read_base 就类似与 num_recs

2.5

通过调用 fsync 函数可以缓冲区的内容写到文件中。

2.6

代码如下:

int main(int argc, char const *argv[])
{
  int fd0, fd1, fd2, n_chars;
  if ((fd0 = open(argv[1], O_RDONLY)) == -1)
    {
      perror("Cannot open file");
      return -1;
    }
    if ((fd1 = open(argv[1], O_WRONLY)) == -1)
    {
      perror("Cannot open file");
      return -1;
    }
    if ((fd2 = open(argv[1], O_RDONLY)) == -1)
    {
      perror("Cannot open file");
      return -1;
    }

    char buf[20];
    n_chars = read(fd0, buf, 20);
    printf("%s\n", buf);

    char str[] = "testing 123......";
    n_chars = write(fd1, str, strlen(str));

    n_chars = read(fd2, buf, 20);
    printf("%s\n", buf);

  return 0;
}

运行后 fd0 正常显示,fd2 显示的内容显示 fd1 写入的内容。

2.7

man man 命令可以查看 man 的各种用法,一共九个章节,每个页面包含 NAME,概述(SYNOPSIS),配置(CONFIGURATION),描述(DESCRIPTION),选项(OPTIONS),退出状态(EXIT STATUS),返回值(RETURN VALUE),错误(ERRORS),环境(ENVIRONMENT),文件(FILES), 版本(VERSIONS),符合标准(CONFORMING TO),注(NOTES),缺陷(BUGS),示例(EXAMPLE),作者(AUTHORS)和见(SEE ALSO).

2.8

ut_addr_v6 保存远程主机的网络地址,__glibc_reserved 是保留空间,以待未来使用。ut_session 是Session ID, used for windowing.

2.9

代码如下:

int main(int argc, char const *argv[])
{
  int rw_fd, n_chars;
    if ((rw_fd = open(argv[1], O_RDWR)) == -1)
    {
      perror("Cannot open file");
      return -1;
    }

    char buf[20];
    lseek(rw_fd, 100, SEEK_END);
    n_chars = read(rw_fd, buf, 20);
    printf("%s\n", buf);

    char str[] = "hello";
    lseek(rw_fd, 2000, SEEK_END);
    n_chars = write(rw_fd, str, strlen(str));

    n_chars = read(rw_fd, buf, 20);
    printf("%s\n", buf);

  return 0;
}

从文件末尾以后100个字节的地方开始读会显示一些乱码,但是文件大小不会变化,从100字节增加到2000字节,再写入“hello”后文件会被撑大,文件大小从 0 变成了 2005,最后的5个字节是 hello 的空间,前面的 2000 个字节里全部用 0 填充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

thewangcj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值