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