유닉스 kill 시스템 호출 질문있습니다

fhdaos10의 이미지

지금 small쉘 구현 연습중인데요;;

인터럽트를 받으면 백그라운드 프로세스는 계속 실행이 되고 포어그라운드 프로세스만 종료시킬려고 합니다.

근데 kill의 pid 값으로 포어그라운드 프로세스 id값을 분명히 주는데도 종료되는 것은 백그라운드까지 포함한 모든 프로세스가 죽어버립니다;;

어떻해야 할까요?

익명 사용자의 이미지

pid를 어떻게 구했는지, kill 명령은 정확히 어떻게 사용하셨는지 적어주시겠어요?

fhdaos10의 이미지

아 죄송합니다.

pid 구현은
pid=fork()
와 같이 구현하였습니다. pid 변수는 하나뿐이고 이 pid에는 가장 최근의 자식프로세스 ID값이 들어가게 됩니다.
즉, 쉘에서 &연산을 통해 다수의 백그라운드 프로세스를 실행시키더라도 pid에는 가장 최근의 자식 프로세스id값이 들어가게 되는 것입니다.
이러한 점을 이용하여 만약 인터럽트 발생시 백그라운드 프로세스는 그대로 놔두고 포어그라운드 프로세스만 종료시킬 수 있도록 시그널 핸들러 함수 내에
kill(pid, SIGTERM)와 같이 코딩하였습니다.
제 생각대로라면 pid는 최근의 자식 프로세스 id값이므로 인터럽트 발생시 포어그라운드 프로세스만 종료가 되어야하는데 이상하게 백그라운드 프로세스까지 모두 종료되어
버립니다.

익명 사용자의 이미지

fork()직후 child process 쪽에서 곧바로 setsid(); 을 한 후 같은 작업을 다시 실행해보세요..
parent로부터 fork된 child의 경우는 parent가 죽으면 좀비 프로세스가 되기 때문에 setsid를 이용해 child process를 init 프로세스에 매달이 두면 포어 그라운드 프로세스가 종료되더라도 살아있을거에요

fhdaos10의 이미지

크헉 감사합니다 ㅜㅜ

하룻 꼬박 고민해도 답이 안됬던걸 가슴이 후련하네요!