2017-10-23 10 views
1

아주 제한된 기본 기능을 가진 미니 쉘을 작성하려고합니다. 그러나 지금은 SIGINT를 다룰 때마다 명령을 다시 입력하기 전에 다시 입력해야합니다.SIGINT를 처리 한 직후에 C 미니 쉘이 반환되지 않습니다.

void loop() 
{ 
    struct sigaction sa; 
    sa.sa_handler = do_nothing; 
    int exit_status; 
    do 
    { 
     char **args; 
     sigaction(SIGINT, &sa, NULL); 
     my_str("\nMINISHELL: "); 
     my_str(current_directory); 
     my_str("/ $: "); 
     args = get_args(); 
     exit_status = execute(args); 
    } 
    while(exit_status); 
} 
void do_nothing() 
{ 
    my_str("\nMINISHELL: "); 
    my_str(current_directory); 
    my_str("/ $: "); 
} 

나는 단지 내가 쓰기 <unistd.h>, <sys/types.h>, <signal.h>, <unistd.h><sys/wait.h>뿐만 아니라 어떤 방법을 사용할 수 있어요. 즉 my_str()write() sys 호출로 구현 한 문자열 인쇄 명령문입니다.

제발 도와주세요.

+0

",,,, 및 _ 만 사용할 수 있습니다." 무엇을 원하십니까? – jwdonahue

+0

https://stackoverflow.com/questions/8573842/use-of-sigaction – jwdonahue

+0

@jwdonahue OP에는 마크 다운 엔진이 (알 수없는) HTML 요소 태그로 처리 한 꺾쇠 괄호가있는 파일 이름이 있습니다. 나는 그들이 눈에 보이도록 고정시켰다. –

답변

0

전체 sigaction struct을 초기화하지 못하고 있으며 처리기 내에서 I/O 함수를 호출하고 있습니다. 설명서 및 SIGINT 핸들러 설정 예제는 pubs.opengroup.org을 참조하십시오. 귀하의 처리기가 많이하지 않아야합니다. 프로그램의 메인 루프가 응답 할 수있는 플래그를 설정하거나 증가시킵니다. sigaction 호출에서 반환 상태를 확인해야합니다.

+0

많은 도움을 주셔서 대단히 감사합니다. 이제 내 유일한 문제는 다른 명령을 입력하기 전에 minishell을 실행하고 ctrl + c를 누르면 다른 명령을 입력하기 전에 Enter 키를 눌러야한다는 것입니다. 그러나, 다른 모든 인스턴스에서는 작동합니다. 다시 감사합니다. –

+0

ctrl + c를 발견 한 후 fflush (stdin)을 수행하고 신호 처리기에서 수행하지 마십시오. – jwdonahue