본문 바로가기
운영체제/xv6

xv6 Lab: Utilities (5) xargs

by JaeminRyu 2022. 9. 3.
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