MIT6.S081 lab1

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);
    


    
    
   
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值