if (stat(buf, &st) < 0) { printf("find: cannot stat %s\n", buf); continue; }
if (strcmp(de.name, ".") == 0 || strcmp(de.name, "..")==0) { continue; } switch (st.type) { case T_FILE: if (strcmp(p, filename) == 0) { printf("%s\n", buf); } break; case T_DIR: find(buf, filename); break; default: break; } // close(fd); } }
int main(int argc, char *argv[]) { if (argc < 2) { printf("find error: need at least two arguments 'filepath' and 'filename'\n"); exit(0); } find(argv[1], argv[2]); exit(0); }
xargs
这道题我一开始没理解到题目意思,我以为要写一个和 unix 一模一样的出来,一下子给我整懵了,当时也不是不可以写,但是仔细读题干发现要求完全不同好吧,xargs 后边儿执行的内容除了 exe_args 的以外,其他的是从标准输入进行输入的,那这样就好写很多阿,保存好 xargs 后边儿执行的命令,默认每次执行一次,只需要吧前边儿的内容嵌近来就 ok
if (argc < 2) { printf("xargs error: need at least 2 arguments\n"); exit(0); }
/// To get the xargs command args /// We need not to make the optimizations for xargs -n 1 echo line the fot the choice -n 1 /// its always -n 1 for this lab char *exec_args[MAXARG]; char buf[512]; int cnt = 0;
for (int i = 1; i < argc; ++i) { exec_args[cnt] = (char *) malloc(20); memmove(exec_args[cnt], argv[i], strlen(argv[i])); cnt++; }
exec_args[cnt] = (char *) malloc(20); int len = read(0, buf, sizeof(buf)); int start = 0;
for (int i = 0; i < len; i++) { if (buf[i] == '\n') { memset(exec_args[cnt], 0, 20); memmove(exec_args[cnt], buf + start, i - start); exec_args[cnt + 1] = (char *) 0; start = i + 1; if (fork() == 0) { exec(*exec_args, exec_args); } else { wait(0); } } } exit(0); }