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 填充。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容