2014-10-22 2 views
1

10 개의 프로세서를 사용하여 매번 다른 인수로 100 번 실행해야하는 프로그램이 있습니다.C++을 사용하여 여러 시스템() 명령 대기

그래서 기본적으로 내 목록을 완성하기 위해 여러 시스템 호출을 수행하려고합니다. 그러나 for 루프에 system()을 넣으면 하나의 프로세서 만 사용되며 하나씩 차례로 이동합니다. 동시에 여러 프로그램을 실행할 수있는 터미널을 여러 개 열 수 있습니다. 마지막 보고서가 끝나면 특정 프로세서에 풀에서 새 작업을 할당 할 수 있습니까?

사전

+1

아마도 GNU 병렬에 대한 단일 시스템 호출을 만들어 동시 작업을 조정하도록 요청할 수 있습니까? [man page here] (http://www.gnu.org/software/parallel/man.html)를 참조하십시오. –

+0

프로세스를 대기열에 넣고 *와 * 동시에 실행하고 싶습니까? – juanchopanza

+0

내 직업은 내 프로세서보다 많아서, 내 프로세서 작업만큼 병렬로 실행하고 나머지는 풀에 보관하고 싶습니다. – user4168715

답변

3

당신은 fork, execwait 시스템 호출에 대해 읽어야에 감사드립니다.

원칙적으로 각 하위 프로세스에 대해 fork/exec 조합을 사용하고 해당 PID를 기록합니다. 원하는 프로세스가 모두 실행 중이면 wait 또는 변형을 사용하여 완료 될 때까지 기다리십시오. 그런 다음 반환 값을 처리하고 다른 프로세스를 시작할 수 있습니다.

+0

그리고 또한 관련된'waitpid' syscall. [Advanced Linux Programming] (http://advancedlinuxprogramming.com/)을 읽어보십시오 :이 주제에는 여러 장이 있습니다. 그리고 아마도 수백 개의 프로세스를 동시에 포기하지 않아야합니다 (많아야 수십 개만). –

1

대신 popen()을 사용하는 것이 좋습니다. system()은 이것에 대한 좋은 옵션이 아닙니다. 원하는만큼 스트림을 열고 (이유 내에서) 각각의 프로세스와 독립적으로 통신 할 수 있습니다. popen()은 fork + pipe + exec를 래핑하고 프로세스는 상위 프로세스와 독립적으로 OS에 의해 스케줄됩니다.

또는 fork/exec를 사용하여 직접 구현하는 것을 고려해보십시오. waitpid 등을 사용하여 ididual PID의 상태를 확인하여 종료 코드를 알 수 있지만 popen()을 사용하여 프로그램에서 텍스트 리턴 메시지를 구문 분석하여 더 많은 피드백을 얻는 것이 좋습니다.

+0

"popen의 단점은 자식 종료 상태를 거두고 있습니다."-'pclose' 호출 중에 문제가 발생 했나요? –

+1

@TonyD - 솔직히 나는 pclose()에 대한 문제를 기억하지 못했습니다. 보통 popen()을 사용하고 있다면 텍스트로 처리하고, 끝내면 pclose() 및 fire 잊어 버려. 그러나 잠시 전에 대답하기 전에 오류 코드에 대한 메뉴얼 페이지를 확인했을 때, 나는 문서를 잘못 읽고'pclose()가 할 수 없다면 ... '라고 말할 때'pclose()가 자식 상태를 얻을 수 없다'라고 생각했다고 생각했습니다. 생각하지 않고 방금 반복했습니다. 솔직히 말해서, 잘못 읽었음에도 pclose()가 종료 상태를 반환했다는 것을 항상 기억하지 못합니다. 항상 파일 추상화라고 가정했습니다. – codenheim

+0

내 대답을 수정했습니다 (@TonyD는 내 오류를 지적했습니다). 나는 진실이 40의 측면에 있다고 생각한다. 나는 내가 아는 것을 잊기 시작한다. ... 또는 내가 그것을 알았 더라면, 나는 지금 기억하지 않는다. : D – codenheim