쉘을 만들고 있는데 Ctrl+Z 문제

hooriza의 이미지

과제로 리눅스 shell 을 만들고 있습니다.

그런데 한가지 모르겠는게...

shell 프롬프트 상태에서는 Ctrl+C 와 Ctrl+Z 를 눌러도
쉘이 중단이나 중지 되지 않잖아요...

그런데 Ctrl+C 는 signal(SIGINT, SIG_IGN);
식으로 중단되지 않게 잡아줬는데...

Ctrl+Z 는 어떻게 잡아야 할지 모르겠네요.
Ctrl+Z 가 눌렸을때 SIGSTOP 이라는 시그널이 발생된다고
하는데 이 시그널은 무시할수가 없는 시그널이라서

signal(SIGSTOP, SIG_IGN); 식으로 무시할수가 없다고...

어떻게 해야 쉘 프롬프트 상태에서 Ctrl+Z 를 눌렀을때
무시하게 할 수 있을까요?

답변 부탁드립니다~

cronex의 이미지

교수님이 그런 것까지 원하시지 않으신다면 굳이 해야 할 이유는 없을 거 같은데요.
저도 그런 숙제를 몇번 해봤습니다만
보통 쉘 프로그래밍에서 주로 고려해야 할 것은
프로세스의 생성과 종료, 파이프 라이닝, 백그라운드 실행 등이었던 거 같습니다.
교수님이 해결하라고 한 문제가 아니면 굳이 신경쓰지 않으셔도 될 듯합니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

hooriza의 이미지

왠지 하고싶더라구요~ -)
그래서 해봤는데 잘 안되서 질문 드린거고요~ 흐으

esrevinu의 이미지

이렇게 하니까 SIGSTOP 도 잡히는데요.

#include <stdio.h>
#include <signal.h>

void handler(int signum)
{
        printf("signum = %d\n", signum);
}

int main()
{
        int i;
        for (i = 1; i < 32; i++) {
                if (i == SIGINT) signal(i, SIG_DFL);
                else signal(i, handler);
        }

        while (1) ;

        return 0;
}

아직 signal() 함수를 다 이해 못했고, 직업 프로그래머도 아니지만
그냥 제 자신이 궁금해서...

esrevinu의 이미지

다시 보니 ctrl+z 는 SIGTSTP (20) 이 발생되네요. SIGSTOP(19) 은 unblockable 이 맞네요.

그럼...