Lab util: Unix utilities

发布时间 2023-04-14 19:11:06作者: lyc2002

Boot xv6

启动 xv6:make qemu

打印进程信息:ctrl-p

退出:ctrl-a x

sleep

在 user 下创建编写 sleep.c,修改 Makefile

pingpong

在 user 下创建编写 pingpong.c,修改 Makefile

#include "kernel/types.h"
#include "user/user.h"

int main(int argc, char *argv[])
{
    char buf[1];

    int p[2];
    pipe(p);

    if (fork() == 0) {
        read(p[1], buf, 1);
        fprintf(1, "%d: received ping\n", getpid());
        write(p[0], "c", 1);
    } else {
        write(p[1], "p", 1);
        sleep(10);
        read(p[0], buf, 1);
        fprintf(1, "%d: received pong\n", getpid());
    }

    exit(0);
}

第 17 行的 sleep 不能删除,如果删除父进程会直接读取写入的字节从而导致子进程的 read 无限阻塞

为避免预测程序流,可以使用两对管道

#include "kernel/types.h"
#include "user/user.h"

int main(int argc, char *argv[])
{
    char buf[1];

    int p[2], p1[2];
    pipe(p);
    pipe(p1);

    if (fork() == 0) {
        read(p[0], buf, 1);
        fprintf(1, "%d: received ping\n", getpid());
        write(p1[0], "c", 1);
    } else {
        write(p[1], "p", 1);
        read(p1[0], buf, 1);
        fprintf(1, "%d: received pong\n", getpid());
    }

    exit(0);
}

primes

创建 pipe,在 fork 后,父子进程都有指向管道写入端和读入端的文件描述符,都要适时关闭

find

在 user 下创建编写 find.c,修改 Makefile

读目录读到的是结构体

// Directory is a file containing a sequence of dirent structures.
#define DIRSIZ 14

struct dirent {
  ushort inum;
  char name[DIRSIZ];
};

xargs

在 for 中 break 竟然会执行 i++

局部缓冲区不能开太大

# 令人疑惑的是,在 xv6 上
$ echo "1\n2"
$ "1\n2"
# 理想结果应该是
$ 1
$ 2