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 프로세스에 매달이 두면 포어 그라운드 프로세스가 종료되더라도 살아있을거에요
pid를 어떻게 구했는지, kill 명령은 정확히
pid를 어떻게 구했는지, kill 명령은 정확히 어떻게 사용하셨는지 적어주시겠어요?
글쓴이
아 죄송합니다.
pid 구현은
pid=fork()
와 같이 구현하였습니다. pid 변수는 하나뿐이고 이 pid에는 가장 최근의 자식프로세스 ID값이 들어가게 됩니다.
즉, 쉘에서 &연산을 통해 다수의 백그라운드 프로세스를 실행시키더라도 pid에는 가장 최근의 자식 프로세스id값이 들어가게 되는 것입니다.
이러한 점을 이용하여 만약 인터럽트 발생시 백그라운드 프로세스는 그대로 놔두고 포어그라운드 프로세스만 종료시킬 수 있도록 시그널 핸들러 함수 내에
kill(pid, SIGTERM)와 같이 코딩하였습니다.
제 생각대로라면 pid는 최근의 자식 프로세스 id값이므로 인터럽트 발생시 포어그라운드 프로세스만 종료가 되어야하는데 이상하게 백그라운드 프로세스까지 모두 종료되어
버립니다.
fork()직후 child process 쪽에서
fork()직후 child process 쪽에서 곧바로 setsid(); 을 한 후 같은 작업을 다시 실행해보세요..
parent로부터 fork된 child의 경우는 parent가 죽으면 좀비 프로세스가 되기 때문에 setsid를 이용해 child process를 init 프로세스에 매달이 두면 포어 그라운드 프로세스가 종료되더라도 살아있을거에요
글쓴이
크헉 감사합니다 ㅜㅜ
하룻 꼬박 고민해도 답이 안됬던걸 가슴이 후련하네요!
댓글 달기