티스토리 뷰
일단 완료되면 자식 프로세스를 종료하지 않는 것처럼 보입니다. 더 많은 프로세스를 생성하는 부모의 메인 루프를 계속하도록하는 것입니다. 또한 프로세스를 실행하고 부모 프로세스가 계산 만 수행하도록하는 것 외에는 아무것도 사지 않는 프로세스를 기다리고있었습니다. 대신 모든 자식을 생성하고 각각의 시간에 완료 될 때까지 기다립니다. 위와 몇 가지 스타일 조정을 통합하기 위해 코드를 재 작업했습니다.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
if (argc == 1) {
fprintf(stderr,"Usage: ./a.out <starting value>\n");
return EXIT_FAILURE;
}
int j;
printf ("How many times would you like this to run?\n");
scanf ("%d", &j);
(void) fpurge(stdin);
printf("\nMain program's process ID: %d\n", getpid());
int n = atoi(argv[1]);
for (int x = 1; x <= j; x++) {
pid_t pid = fork();
if (pid == -1) {
fprintf(stderr, "Unable to fork child\n");
return EXIT_FAILURE;
} else if (pid == 0) { /* child process */
pid_t child_pid = getpid();
printf("\nChild %d (ID: %d)\n", x, child_pid);
printf("\nStart sequence at: %d\n", n);
while (n != 1) {
n = n % 2 ? 3 * n + 1 : n / 2;
printf("\n(Child %d) %d ", x, n);
}
printf("\n\nAbout to end execution (I'm process %d).\n", child_pid);
return EXIT_SUCCESS; /* child terminates */
}
else { /* parent process */
n = n + 3;
}
}
for (int x = 1; x <= j; x++) {
wait(NULL);
}
return EXIT_SUCCESS;
}
샘플 실행
> ./a.out 5
How many times would you like this to run?
4
Main program's process ID: 1164
Child 1 (ID: 1165)
Start sequence at: 5
(Child 1) 16
(Child 1) 8
(Child 1) 4
(Child 1) 2
(Child 1) 1
About to end execution (I'm process 1165).
Child 3 (ID: 1167)
Start sequence at: 11
(Child 3) 34
(Child 3) 17
(Child 3) 52
(Child 3) 26
(Child 3) 13
Child 2 (ID: 1166)
(Child 3) 40
(Child 3) 20
Start sequence at: 8
(Child 3) 10
(Child 3) 5
(Child 2) 4
(Child 3) 16
(Child 2) 2
(Child 3) 8
(Child 2) 1
(Child 3) 4
(Child 3) 2
About to end execution (I'm process 1166).
(Child 3) 1
About to end execution (I'm process 1167).
Child 4 (ID: 1168)
Start sequence at: 14
(Child 4) 7
(Child 4) 22
(Child 4) 11
(Child 4) 34
(Child 4) 17
(Child 4) 52
(Child 4) 26
(Child 4) 13
(Child 4) 40
(Child 4) 20
(Child 4) 10
(Child 4) 5
(Child 4) 16
(Child 4) 8
(Child 4) 4
(Child 4) 2
(Child 4) 1
About to end execution (I'm process 1168).
>
순서가 잘못된 결과로 인해 문제가 발생하면 스레드를 사용하고 기본 스레드에서 인쇄 할 결과를 반환하거나 일종의 잠금을 사용하여 출력을 동기화하는 것이 좋습니다. 또는 부모가 마지막에 요약 한 임시 파일이나 파이프에 결과를 작성하도록합니다.
마지막으로 스타일 노트, -1 반환에서하지 main()
않으며, 할 exit(-1)
- 반환하는 -1 시스템 서브 루틴에 대한 오류를 표시하지만, 반환 된 값 main()
운영 체제의 범위는 0 (성공)에 있어야 255 1 ( 실패) 일반 오류 표시기입니다.
출처
https://stackoverflow.com/questions/39940125
댓글