내 코드 섹션을 완전히 실행하기 전에 코드 섹션을 중단하고 (ctrl-c) 옵션을 사용하여 나머지 코드 실행을 다시 시작합니다. (리눅스 플랫폼에서 작업하고 있습니다.)메서드를 중단하지만 코드의 나머지 부분을 계속 실행합니다.
포크를 만들고 메서드를 호출 한 다음 신호 처리를 사용하는 것으로 추측합니다. 신호 처리에 필요한 단계는 무엇입니까?
void Manager::Run()
{
pid_t pID = fork();
if(pID<0)
exit(1);//give up here
else if(pID==0) {
BuildList(); //I'd like the option to ctrl-c this only
//some code here catch user signal interrupt?
}
else {;}
waitpid(pID,NULL,0);//pause until BuildList() is done or interrupted
PrintList();
}
if/else 부분의 어딘가에 신호 (SIGINT, sigint)와 같은 줄을 사용하고 싶습니다. 그리고 다음과 같은 함수를 정의해야합니다 :
sigint(int param){ signal(param, SIG_DFL);};
단지 자식 프로세스 만 죽이고 싶습니다.
내 문제를 해결하는 것이 올바른 생각입니까? 그렇다면이 신호를 처리하기 위해 어떤 신호 처리가 필요합니까?
UPDATE :
더 완벽하게 내 질문을 해결하기 위해 내가 제안 된 비 포크 (fork) 방법을 탐구. 포크없이이 작업을 수행 할 수 있어야합니다. 불행히도 필자는 몇 번의 시도에서 컴파일 오류가 발생했습니다. 업데이트 된 코드와 새로운 오류가 포함되었습니다. sighandler 기능이 나는이 얻을 정적이 아닌 경우 Manager.hh에서
는
static void sighandler(int signum)
{
PrintList();
exit(1);
};
Manager.cc는
void Manager::Run()
{
signal(SIGINT,sighandler);//sets up sighandler()
BuildList(); //add elements to a list
signal(SIGINT,SIG_DFL); //restore default
PrintList();
}
포함되어 관리자의 전화 signal(SIGINT,sighandler)
에
error: argument of type 'void (Manager::)(int)' does not match 'void (*)(int)'
을 :: Run()을 사용하여 핸들러를 설정하십시오. 내가 정적 sighandler 기능에() 대하여 printList를 호출하면
나는이 얻을 : sighandler에서 PrintList();
통화
error: cannot call member function 'void Manager::PrintList()' without object
을().
마지막으로 PrintList()를 정적 함수 (static sighandler로)로 만들면 List 및 iterator에서 이러한 오류가 발생하여 목록을 단계별로 처리합니다.
error: invalid use of member 'Manager::theList' in static member function
error: invalid use of member 'Manager::it' in static member function
이러한 오류의 주위에 어떤 똑똑한 방법?
나는 신호 문제를 별도의 질문으로 제기해야한다고 생각합니다. 원래 질문에 대한 대답을 수락하면 답을 얻는 것이 더 쉬울 수도 있습니다. –