sleep.c
直接是一个系统调用的使用
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int
main(int argc, char *argv[])
{
if(argc == 2){
sleep(atoi(argv[1]));
}else{
write(1,"something wrong", strlen("something wrong"));
}
exit(0);
}
pingpong.c :
父子进程是彼此独立的,pipe之后的fork 会给父子进程均有一份fd,当父子进程的p[0]或者p[1]关闭后才会真正关闭管道。
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#define MAX 20
int
main(){
int p[2];
pipe(p);
char buf[MAX];
int pid = fork();
if(pid != 0){
write(p[1], "ping", MAX);
// 管道是半双工,必须等一边写完再读, 因此刚写完就去读,可能会读到奇怪的东西?
wait(0);
read(p[0], buf, MAX);
printf("%d: received %s\n", getpid(), buf);
}else{
read(p[0], buf, MAX);
printf("%d: received %s\n", getpid(), buf);
write(p[1], "pong", MAX);
}
exit(0);
}
primes.c
进程之间的通信,看实验书的提示
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#define MAX 33
void
forward(int p[2]){
int pf[2];
int tmp = 0, num = 0;
if( (read(p[0], &tmp, 4) <= 0) ){
close(p[0]);
exit(0);
}
printf("prime %d\n", tmp);
pipe(pf);
close(p[1]);
if(fork() != 0){
while(read(p[0], &num, 4)){
if(num % tmp != 0)
write(pf[1], &num, 4);
}
close(p[0]);
close(pf[1]);
close(pf[0]);
wait(0);
}else{
// close(pf[1]);
forward(pf);
}
}
int
main(){
int p[2];
pipe(p);
if(fork() != 0){
close(p[0]);
for(int i = 2; i < MAX; i++)
write(p[1], &i, 4);
close(p[1]);
// 等子进程处理完自己的所有Prime就关闭父进程
wait(0);
}else{
forward(p);
}
exit(0);
}
find.c
主要是 xv6的文件描述符只有16个,要及时的close(fd),才能遍历整个文件夹
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"
/**
这个实验主要是要关掉 不用的 fd
*/
void find(char* local,char *dest){
char buf[64], *p;
struct dirent de;
struct stat st;
int fd = open(local, 0);
while(read(fd, &de, sizeof(de)) == sizeof(de)){
if(de.inum == 0)continue;
if(!strcmp(de.name, "."))continue;
if(!strcmp(de.name, ".."))continue;
strcpy(buf, local);
p = &buf[strlen(local)];
*p = '/';
p++;
strcpy(p, de.name);
p[strlen(de.name)] = 0;
if(!strcmp(de.name, dest))
printf("%s\n", buf);
int fd_t = open(buf, 0);
fstat(fd_t, &st);
if(st.type == T_DIR){
find(buf, dest);
}
close(fd_t);
}
}
int main(int argc, char *argv[]){
if(argc < 3)
find(".",argv[1]);
else
find(argv[1], argv[2]);
exit(0);
}
xargs.c
// user/xargs.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/param.h"
#define MAX 128
int main(int argc, char *argv[]) {
char buffer[MAX];
char *args[MAXARG];
char *pipe_args[MAXARG];
char *cmd = argv[1];
for(int i = 0; i < argc - 1; i++)
args[i] = argv[i + 1];
read(0, buffer, MAX);
int idx = 0, len = 0;
for(len = 0; buffer[idx] != 0; len++){
pipe_args[len] = &buffer[idx];
while(buffer[idx] != '\n' && buffer[idx] != 0)idx++;
buffer[idx] = 0;
idx++;
}
for(int i = 0; i < len; i++)
if(fork()){
// 父
wait(0);
}else{
args[argc - 1] = pipe_args[i];
exec(cmd, args);
}
exit(0);
}