6.s081 lab1小结

文章详细解析了xargs命令的工作原理,以及它如何通过读取标准输入、分割参数并分发给子进程执行。同时讨论了fork和exec在进程管理和文件操作中的应用,以及涉及到的系统调用如fstat、stat和memmove。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xargs:

//作用: 读取标准输出中的信息,然后将其作为标准输入,拼接到下一个命令后面来执行

#include "kernel/param.h"
#include "kernel/types.h"
#include "user/user.h"
#include "kernel/stat.h"
#include "kernel/fs.h"

int main(int argc, char *argv[]){
    int i;
    int count = 0;
    int k;
    int m = 0;
    char *lineSplit[MAXARG]; //字符串数组,用于存储命令行参数和从标准输入读取的参数
    char buf[32]; //构建参数字符串
    char block[32]; //从标准输入读取数据
    char *p;
    int status;

    p = buf;
    for(i= 1; i< argc; i++){ //除了xargs以外的
        lineSplit[count++] = argv[i];
    }


    while( (k = read(0, block, sizeof(block)))> 0){ //从标准输入读取数据块(也就是管道前的输出)
        //遍历从标准输入读取的每个字符
        for(i = 0; i<k; i++){
            if(block[i] == '\n'){ //是换行符,结束字符串, 执行一次命令行
                buf[m] = 0; //结束字符串
                lineSplit[count ++] = p; 
                lineSplit[count] = 0;
                m = 0;   //归零,为下一次做准备
                p = buf;
                count = argc - 1;

                if(fork() == 0){//子进程中
                    exec(argv[1], lineSplit); //执行
                }else{ //父进程中,等待子进程结束
                    wait(&status); 
                }

            }else if(block[i] == ' '){ //是空格, 结束当前字符串,并接收下一个字符串
                buf[m++] = 0;  //字符串结束, 接受下一个字符串
                lineSplit[count++]= p;
                p = &buf[m]; //指向下一个字符串的开始


            }else{  //不是换行符,也不是空格,而是有效参数,那么就继续往下读
                buf[m++] = block[i]; //存放到参数字符串中
            } 
        }
    }

    exit(0);
}</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值