Git Product home page Git Product logo

42-minishell's Introduction

name

About me

   

Language

               

Frameworks

         

Database

   

🤹‍♀️ Blog Posts

💻 Career

  • Software Engineer @LG CNS : JUL 2023 - PRESENT

🏋 Product Releases

🌱 Learning

  • Korea National Open University - Computer Science : Mar 2022 - PRESENT
  • 42 Seoul Cadet : May 2021 - PRESENT
  • 42 Seoul La Piscine : Mar - Apr 2021
  • Naver Boostcourse Study Group : Jan - Feb 2021
  • CS50x : Dec 2020 - Mar 2021

🏅 Awards

Stats

soyeon's github stats

⭐️ From S0YKIM

42-minishell's People

Contributors

hhkim0729 avatar s0ykim avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

hhkim0729

42-minishell's Issues

exit status($?) 처리

  • 현재 wait_pids() 에서 status 값을 받아 일괄적으로 엑싯 코드 값을 바꾸어주고 있는데, 빌트인이나 다른 명령어들처럼 exit() 으로 엑싯 코드를 넘겨주는 경우 뿐만 아니라 시그널(SIGINT, SIGQUIT) 으로 인한 비정상 종료 시에도 SIGINT(2) SIGQUIT(3) 값을 받아서 바꾸어버리는 문제가 있습니다.
  • 엑싯 코드를 넘겨받은 경우에만 update_env() 로 엑싯 코드를 바꾸어주고, 시그널로 인한 종료와 같은 나머지 경우에는 이미 엑싯 코드가 전처리되어 있을 것이므로 바꾸지 않도록 수정 부탁드립니다.

테스트

  1. 첫 번째 테스트 케이스
  2. 테스터 모음
  3. minishell_tester
    메인을 아래처럼 편집하고 사용해야 함
int	ft_launch_minishell(t_data *data, char *line)
{
	int result;

	if (!line)
	{
		printf("exit\n");
		return (SUCCESS);
	}
	else if (!*line)
		return (SUCCESS);
	add_history(line);
	result = parse_and_execute(data, line);
	if (result == ERROR)
		return (SUCCESS);
	else if (!result)
		return (FAILURE);
	return (SUCCESS);
}

int	main(int argc, char **argv, char **envp)
{
	t_data	data;

	if (argc >= 3 && !ft_strcmp(argv[1], "-c"))
	{
		if (!init(&data, envp))
			exit(EXIT_FAILURE);
		int exit_status = ft_launch_minishell(&data, argv[2]);
		exit(exit_status);
	}
	return (SUCCESS);
}

시그널 테스트..

cat | ls 같은 명령어를 입력하여 자식 프로세스에서 입력 대기를 하는 경우
^C를 입력하면 부모 쉘이 종료되는 문제 발생

파이프 구현

  • heredoc 처리 (파일 만들고 fd 저장)
  • 파이프 생성
  • 리다이렉션 순회
  • fd dup

메모리 누수 검사

  • 에러 또는 중단 시 메모리 정리하고 종료하는 함수 구현 (필요 없을까요?)
  • 자식 프로세스 실행 중 누수 검사
  • 부모 프로세스 실행 중 누수 검사
  • 닫히지 않은 파이프 누수 검사

export 테스트

export 테스트

미니쉘

export b$
export b-8

image

  • 문제 없이 실행됨 (첫 번째 문자만 유효성 검사하고 있는 것 같은데 맞나요?)

배쉬

image

Originally posted by @hhkim0729 in #172 (comment)

환경변수 공백 트리밍

export a="    a    b    "

echo $a 👉 `a b`
echo "$a" 👉 `    a    b    `
bash-3.2$ cat $a
cat: a: No such file or directory
cat: b: No such file or directory

bash-3.2$ cat "$a"
cat:    a    b   : No such file or directory

시그널 처리

  • SIGINT 처리
  • SIGQUIT 처리
  • SIGTERM 처리
  • exit code 전역변수로 처리

환경변수 리스트 이중 연결 리스트로 변경 요청

ft_unset() 함수 구현 중 해당 노드를 삭제하는데 직전 노드와 다음 노드를 연결해주는 과정에서 prev 포인터가 없어서 어려움을 겪고 있습니다. 환경 변수 리스트를 이중 연결 리스트로 변경해주시면 감사하곘습니다!

ft_export() 함수에서 add_new_node() 를 이용하는 문제

export abc=123 과 같이 '=' 가 들어가면 아무런 문제가 없지만, export abc 처럼 값을 주지 않고 키만 넘겨주는 경우 문제가 생깁니다.
add_new_node() 는 애초에 초기 환경변수 리스트를 불러오는 것을 전제로 만들어진 함수였기 때문에 무조건 '=' 가 들어가 있는데, export 명령어에서 사용하기에는 문제가 있어 리팩토링 하도록 하겠습니다!

오류 예외 처리

몇몇 함수들을 사용할 때, 해당 함수에서 오류를 반환하지만 사용하는 함수에서 예외처리를 하지 않는 경우가 보입니다.
전체적으로 리팩토링을 한번 해야 할 것 같습니다.

export 출력 시 오름차순 정렬

그때 안 하기로 했었던 거 같지만 다들 하더라고요...
배쉬와 같이 동작해야 한다고 하면 하는 게 맞을 것 같아서 올려봅니다~~

명령어 파싱

readline으로 받은 명령어 파싱

  • 토큰 분리 (세미콜론, 파이프 등)
  • 환경변수 치환
  • 타입 구분 (명령어, 파이프, 리다이렉션 등) - AST 생성
  • AST 정리 (명령어인 경우 옵션과 인자 char **으로 합치기)

밸류가 존재하지 않는 환경변수는 존재하지 않는 취급

밸류가 존재하지 않는 환경변수는 존재하지 않는 취급을 해야 함 => 파싱할 때 아예 삭제를 해야 할 듯..?

$a가 존재하지 않을 때

  • export $aexport와 동일하게 동작
  • export "$a"는 빈 문자열이 들어온 것으로 인식하여 오류 발생

ft_export() 로 설정할 환경변수의 값이 $로 시작하는 경우

예를 들어 export ABC=$? 를 입력하면 환경변수 $? 의 값을 불러와서 실제로는 ABC=1 의 형태로 치환되어 환경변수가 저장됩니다.
하지만 지금 구현한 ft_export()에서 환경변수를 저장할 때에 쓰는 add_env_node() 함수는 '=' 를 기준으로 뒤에 나오는 문자열을 그대로 값에 넣어주게 됩니다.

아예 명령어 파싱하는 부분에서 $로 시작하는 단어를 체크해서 미리 치환해주어 ft_export() 의 매개변수로 받는 cmd 를 export ABC=$? 가 아닌 export ABC=1 으로 넘겨주면 해결될 문제 같네요!

환경변수 파싱

main 함수의 세 번째 인자로 받는 char **envp 를 key-value 형태로 파싱

파이프에 연결된 명령어의 오류가 출력되지 않는 문제

export 123 | echo 123 같은 명령어를 실행하면 export의 아웃풋이 파이프로 연결됩니다.
이로 인해 오류 메시지를 printf를 이용해서 STDOUT으로 출력하면 콘솔에 출력이 되지 않습니다.

오류 메시지들은 ft_putstr_fdft_putendl_fd 등 libft 함수를 사용해서 STDERR에 출력해주세요.

메모리 누수 문제

현재 main 문의 가장 끝에 system("leaks minishell"); 을 추가하여 실행하면 70개의 메모리 누수가 뜨네요! 빌트인 함수나 다른 함수를 추가하지 않고도 메모리 누수가 나는 것으로 보아 create_astree() 에서 발생한게 아닐지 추측하고 있어요 한 번 확인 부탁드립니다~

syntax error 검사

명령어를 실행하기 전에 syntax error 검사

  1. 파이프에 실행할 명령어가 없는 경우 (| || cat | 등)
  2. 리다이렉션 파일이 없는 경우 (< cat < cat < | ls 등)

에러 메시지의 규칙을 정확히 모르겠어서 모두 syntax error로 출력하도록 하였습니다.
(서브젝트 요구사항에 에러 메시지를 똑같이 출력하라는 부분이 없기 때문에 이렇게 해도 무방할 것 같아요~!)

명령어 실행

빌트인 함수나 쉘 명령어 등을 실행시켜주는 함수 구현

미니쉘 안에서 미니쉘 실행 시 환경변수를 받지 못하는 문제

생각해보니까 execve를 쓸 수 있는 이유가 환경변수 전달을 할 수 있어서였던 거 같아요.
execve 함수 마지막 인자로 환경변수를 보낼 수 있는데, 거기다 NULL을 보내고 있어서 환경변수를 못 받았던 거 아닌가 싶습니다.
문제는 가공되지 않은 envp 값을 넘겨주려면 이걸 어디에 담아서 들고다니거나 해야 할 거 같은 느낌..?

get_env_value 오류

env_list에서 key의 길이만큼만 비교해서 일치하는 경우 해당 밸류를 가져오는데, 앞의 문자열이 겹치는 경우 가장 앞에 있는 밸류를 그냥 가져와버립니다.

if (!ft_strncmp(curr->key, key, ft_strlen(key)))
    return (ft_strdup(curr->value));

예: $TERM 키가 존재하지 않지만 $TERM_PROGRAM의 밸류를 가져옴

curr->key의 길이와 key의 길이가 같은지도 비교를 해주셔야 할 것 같습니다.

환경변수 관련 함수 구현

  • 환경변수 키 이름으로 값 찾아주는 함수
  • 키와 값을 넘겨주면 새로운 환경변수를 설정해주는 함수
  • unset 명령어 사용 시 환경변수 노드 제거하는 함수

exit 테스트

exit 테스트

미니쉘

image

  • 인자가 여러 개일 때 오류 메시지를 띄우고 종료됨

image

  • 숫자로 인식되는 듯..? 오류 메시지를 띄우지 않고 0을 리턴

배쉬

image

  • 인자가 여러 개일 때 오류 메시지를 띄우고 종료되지 않음

image

  • 문자로 인식

Originally posted by @hhkim0729 in #172 (comment)

명령어 실행 결과가 부모 프로세스에 반영이 안 되는 문제

예를 들어 unset OLDPWD 를 입력하고 env 를 해보면 OLDPWD 가 삭제되지 않고 그대로 남아있습니다. 환경변수 리스트 g_env_list 가 자식 프로세스에서만 변경되고 exit 되어, 부모 프로세스에서는 여전히 변경 전의 모습으로 남아있는 것으로 추정됩니다. 이뿐만 아니라 cd [이동할 디렉토리] 명령어 역시 같은 원리로 작동하지 않습니다 아마 자식프로세스에서만 경로를 이동하고 부모에서는 여전히 그대로 남아있는 것 같네요...

ls | cat 처럼 이전 파이프라인의 output 이 다음 파이프라인의 input 으로 직접 넘어가는 경우 뿐만 아니라, 이런 상태변화도 고려를 해주어야겠어요!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.