2012-10-01 2 views
1

여기에이 코드가 있습니다.이 코드는 병렬 또는 순차를 통해 여러 프로세스에서 여러 번 프로그램을 실행하는 것입니다. 일정 시간이 지나면 프로그램을 중단하기 위해 모든 어린이를 죽일 필요가 있습니다.특정 시간에 도달 한 후 자식 프로세스를 중지하십시오.

하지만 아이를 죽이려고 할 때마다이 줄 execvp (cmdTokens [0], cmdTokens);를 현재 실행중인 자식은 끝날 때까지 멈추지 않습니다. 루프를 죽인 것처럼 보이지만 현재 실행중인 자식은 아닙니다.

+1

'cid'는'waitpid()'를 처음 호출 할 때 초기화되지 않습니다. 이것은 좋은 생각이 아닙니다. 아마 그것의 반환 값을 확인해야합니다. 실행 실패시 0이 아닌 값을 사용하여 종료하는 것이 일반적입니다. 표준 출력이 아닌 표준 오류 채널에 오류를보고하는 것도 좋은 생각입니다. 'alarm()'의 논리는 의심 스럽습니다. 'alarm()'은 장래의 시그널을 설정해, 일반적으로 즉시 리턴합니다. 아마도 SIGALRM 핸들러를 설정하고 알람을 설정하고 EINTR (아마도 타임 아웃이 발생했음을 나타냄) 또는 자식이 죽어 가고 있는지 확인한 후에'waitpid()'를 수행해야합니다. –

+0

감사합니다. 나는 당신이 나에게 말할 때까지 어떻게 경보 기능이 작동 하는지를 몰랐다. 내가 한 일은 알람 방법을 상단으로 옮겨서 당신이 말한대로 미래 신호를 설정할 수 있습니다. – user1713114

답변

1

함수의 exec 클래스는 성공한 경우 절대로 반환하지 않습니다. 그들은 본질적으로 프로세스를 당신이 호출하는 것으로 변형시킵니다. 이것이 원래 프로세스를 계속 실행하려고한다고 가정 할 때 exec를 호출하기 전에 fork하는 이유입니다. 프로세스를 시작하지 않으면 반환 할 수 있습니다 (예 : 찾을 수없는 파일).

관련 문제