2016-10-08 4 views
0

사용자에게 실행 횟수를 묻는 Collatz 구조를 만들려고합니다. 그런 다음 매번 3 씩 증가하는 코드를 반복합니다 (n = n + 3). 코드가 부분적으로 작동하는 동안 완료된 이전 프로세스가 계속 반복됩니다. 입력이 5이고 프로세스를 "Child 1 = 5, 16, 8, 4, 2, 1"및 "Child 2 = 8,4,2,1"및 "Child 3 = 11,34,17 , 52,26,13, 등. "
문제는 반복 횟수가 너무 많아서 각 하위를 여러 번 실행하는 것입니다. 한 번 정확하고 두 번째로 실행하면 "1"에서 시퀀스가 ​​시작됩니다.
저는 이것을 Linux Debian에서 실행하고 있습니다. 컴파일하려면 "gcc -o filename filename.c"를 사용하고 실행하려면 "./filename 5"를 사용하십시오. 여기서 5는 Collatz 구조의 "n"에 전달 된 번호입니다. 그런 다음 루프를 실행할 횟수를 묻습니다.
나는 아마 벗어났다는 것을 이해하지만, 나는 완전히 잃어 버렸고 어떤 도움을 주시면 감사하겠습니다. 그것은, 당신은 그냥 이상의 프로세스를 산란 부모의 메인 루프를 계속시키는 것 완료되면 당신은 자식 프로세스를 종료하지 않는 것처럼Collatz 구조 루프

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    int n, j, x; 
    printf ("How many times would you like this to run?\n"); 
    scanf ("%d",&j); 

    if (argc == 1) { 
     fprintf (stderr,"Usage: ./a.out <starting value>\n"); 
     return -1; 
    } 
    printf("\nMain program's process ID: %d\n",getpid()); 
    n = atoi(argv[1]); 

    for (x=1; x <= j; x++){ 
     pid = fork(); 

     if (pid < 0) { 
      fprintf(stderr, "Unable to fork child\n"); 
      return -1; 
     } 
     else if (pid == 0) { /*child process */ 
      printf("\nChild %d (ID: %d)\n",x,getpid()); 
      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",getpid()); 
     } 
     else { /* parent process */ 
      wait(NULL); 
      n = n + 3; 
     } 
    } 
    return 0; 
} 

답변

0

그것은 나에게 보인다. 또한 프로세스를 실행하고 기다리는 동안 부모 프로세스가 계산을 수행하도록하는 대신 아무 것도 구입하지 않고 대신 모든 자식을 생성하고 각각의 자식을 완료 할 때까지 기다립니다. 나는 위의 일부 스타일의 비틀기를 통합하는 코드를 재 작업했습니다

#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; 
} 

샘플 RUN

> ./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). 
> 

주문 결과의 밖으로 당신을 귀찮게하는 경우에 그 결과를 스레드를 사용하고 반환 고려 주 스레드에 의해 인쇄되거나 일종의 잠금을 사용하여 출력을 동기화 할 수 있습니다. 또는 부모가 결과를 요약 한 임시 파일이나 파이프에 결과를 기록하게합니다.

마지막으로 스타일 노트, main()에서 -1 반환하지 않으며, exit(-1)을 - 반환하는 -1 시스템 서브 루틴에 대한 오류를 표시하지만, 운영 체제에 main()에 의해 반환 된 값 (범위는 0에 있어야합니다 성공)을 255로 설정하고 1 (실패)은 일반적인 오류 표시 자로 사용합니다.

+0

아, 훨씬 더 의미가 있습니다. 내가 변수와 코드의 일부를 잘못된 섹션에 넣고 있지만이를 수정하는 방법을 알 수는 없다는 것을 알고있었습니다. 무수한 시간과 며칠을 보내십시오. 너는 나를 확실히 구했다. 그 여분의 팁뿐만 아니라, 훌륭한 정보를 주셔서 감사합니다! 고맙습니다! – asyncle