代码
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"
#include "kernel/param.h"
int
main(int argc, char* argv[])
{
int fd[2];
char s;
char *params[MAXARG];
int i = 0;
int j = 1;
int t;
pipe(fd);
if (fork() == 0) {
close(fd[1]);
params[0] = malloc(sizeof(char) * MAXARG);
params[1] = malloc(sizeof(char) * MAXARG);
while(read(fd[0], &t, 1) != 0) {
if(t != '\n') {
params[j][i++] = t;
} else {
params[j][i] = '\0';
j++;
params[j] = malloc(sizeof(char)*MAXARG);
i = 0;
}
}
exec(argv[1], params);
for (i = 0; i <= j; i++) {
free(params[i]);
}
close(fd[0]);
} else {
close(fd[0]);
for (int i = 2; i < argc; i++) {
write(fd[1], argv[i], strlen(argv[i]));
write(fd[1], "\n", 1);
}
while(read(0, &s, 1) != 0) {
if (s == ' '){
write(fd[1], "\n", 1);
} else {
write(fd[1], &s, 1);
}
}
write(fd[1], "\n", 1);
close(fd[1]);
wait(0);
}
exit(0);
}
实验目的
写一个简单的UNIX xargs程序,实现下面的功能
思路
- 在父进程中,将管道右边的参数(如argv[2], argv[3]…)写入fd[1]文件描述符(code 39-42行)
- 在父进程中,将管道左边的输出从标准输入读入,写入fd[1]文件描述符(code 43-49行)
- 在子进程中,使用fd[0]文件描述符读入步骤1和2中写入的参数, 并保存在指针数组params中
- 使用exec执行
细节
- 不同的参数之间通过"\n"分隔开(code 41、45、50行),以便于确定实际指针params的数量(code 23-30行)
- 这里指针数组params中的每一个字符串都需要动态分配内存,否则指向NULL,得不到想要的结果(code 35行)
- 不要忘记释放掉动态分配得到的内存(code 33-35行)
结果
从测试得到的结果来看,我们的程序是正确的