728x90
이 문제는 MIT의 xv6 수업에 출처가 있습니다.
출처 : Lab: Xv6 and Unix utilities (mit.edu)
Write a simple version of the UNIX xargs program: read lines from the standard input and run a command for each line, supplying the line as arguments to the command.
The following example illustrates xarg's behavior:
$ echo hello too | xargs echo bye
bye hello too
$
xargs 명령어는 어떠한 명령어의 출력을 인수로 다른 명령어를 실행시킬 때 사용한다.
이때 파이프 명령어(|)는 stdout 즉 표준 출력으로 뒤에 있는 명령어에게 값을 전달한다.
따라서 stdin 즉 표준 출력으로 해당 인수를 처리하면 된다.
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/param.h" //MAXARG
int main(int argc, char *argv[]){
char buf[1024];
int buf_idx = 0;
int st_idx = 0;
char *xargv[MAXARG]; //실행시킬 인수들
int x_idx = 0;
char ch;
if(argc <= 1){
printf("Usage: xargs <command> <argv..>");
}
//<command>부터 인수 복사
for(int i = 1; i<argc; i++){
xargv[x_idx++] = argv[i];
}
//파이프 읽기
while(read(0,&ch,1)){
if(ch == ' '){
buf[buf_idx++] = 0;
xargv[x_idx++] - buf + st_idx;
}
else if(ch == '\n'){
buf[buf_idx++] = 0;
xargv[x_idx++] = buf + st_idx;
xargv[x_idx] = 0;
if(!fork()){ //child
exec(argv[1],xargv);
exit(0);
}
wait(0);
st_idx = buf_idx;
x_idx = argc - 1;
}
else{
buf[buf_idx++] = ch;
}
}
exit(0):
}
728x90
'운영체제 > xv6' 카테고리의 다른 글
xv6 Lab: Utilities (4) find (0) | 2022.09.02 |
---|---|
xv6 Lab: Utilities (3) primes (0) | 2022.09.01 |
xv6 Lab: Utilities (2) pingpong (0) | 2022.08.31 |
xv6 Lab: Utilities (1) sleep (0) | 2022.08.31 |