#include "kernel/types.h" #include "kernel/stat.h" #include "user/user.h" #include "kernel/fs.h" #include "kernel/fcntl.h" #include "kernel/param.h" // 一次性读完,存储到buf中 void read_in(char *buf) { int cur_size = 0, size = 0; while ((cur_size = read(0, buf + size, 1)) > 0) size += cur_size; } // 从str读取一行字符串到buf中,去掉\n补上0 int next_line(char *buf, char *str) { // printf("str: %s\n", str); if (*str == 0) return 0; char *p = str; // 会直接遇到\n int cnt = 0; while (*p != '\n' && *p != 0) { p++; cnt++; } memmove(buf, str, cnt); // printf("next_line :%s, cnt: %d\n", buf, cnt); return cnt; } // 去除buf中的空格,将结果存储到result中 int parse_line(char **result, char *buf) { int cnt = 0; char *p = buf; while (1) { while (*p == ' ' && *p != 0) p++; if (*p == 0) return cnt; int arg_len = 0; // 遇到非空白非0字符,解析参数 char *arg_start = p; while (*p != ' ' && *p != 0) { p++; arg_len++; } *(result + cnt) = (char *)malloc(arg_len + 1); // 指针运算需要注意 memmove(*(result + cnt), arg_start, arg_len); result[cnt++][arg_len] = 0; } } int main(int argc, char *argv[]) { if (argc < 2) { printf("xargs 参数个数不正确\n"); return -1; } // printf("argc=%d\n", argc); char *args[MAXARG]; for (int i = 2; i < argc; i++) { args[i - 2] = argv[i]; // printf("copied argv:%s\n", argv[i]); } char buf[512] = {0}; read_in(buf); // printf("buf:%s。\n", buf); int cur_size = 0, index = 0; char line[512] = {0}; while ((cur_size = next_line(line, buf + index)) > 0) { printf("\n newline, cmd:%s\n", argv[1]); if (fork() == 0) { int total = argc - 2 + parse_line(args + argc - 2, line); args[total] = 0; // 参数数组以 NULL 结束 for (int i = 0; i < total; i++) printf("args:%s\n", args[i]); exec(argv[1], args); printf("exec %s 失败\n", argv[1]); } wait(0); index += cur_size + 1; // +1因为\n memset(line, 0, cur_size + 1); } exit(0); }