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