2016-10-08 2 views
0

Я пытаюсь создать структуру Collatz, которая запрашивает у пользователя, сколько раз они хотели бы запустить его. Затем он циклически меняет код, увеличивая каждый раз на 3 (n = n + 3). Хотя код частично работает, он продолжает повторять предыдущий процесс, который завершен, например. с входом 5 и запуском процесса 3 раза «Ребенок 1 = 5, 16, 8, 4, 2, 1» и «Ребенок 2 = 8,4,2,1» и «Ребенок 3 = 11,34,17 , 52,26,13 и т.д. «.
Проблема в том, что она чередуется слишком много раз и запускает каждый Child несколько раз. Одно время это правильно, и во второй раз, когда он запускает его, он запускает последовательность в «1.»
Я запускаю это из Linux Debian. Для компиляции я использую «gcc -o filename filename.c», а затем для выполнения использую «./filename 5», где 5 - это число, переданное в «n» для структуры Collatz. Затем он запрашивает, сколько раз запускать цикл.
Я понимаю, что я, вероятно, далеко, но я полностью потерян и буду очень признателен за любую помощь.Collatz Structure Loop

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

Если из результатов порядка беспокоить вас, рассмотреть возможность использования потоков и возврат результатов печататься по основному потоку или использовать какую-то блокировку для синхронизации результата. Или дети записывают результаты во временные файлы или каналы, которые в конце вырабатывает родитель.

Последнее замечание стиль, не возвращают -1 от main(), и не exit(-1) - хотя возвращение -1 указывает на ошибку для системных подпрограмм, значение, возвращаемое main() к операционной системе должно быть в диапазоне от 0 (успех) до 255 с 1 (отказ), являющимся общим индикатором ошибки.

+0

ahh, что дает больше смысла. Я знал, что помещаю некоторые переменные и код в неправильные разделы, но не мог понять, как их исправить. Проводите бесчисленные часы и даже дни. Ты определенно спас меня. Я ценю эти дополнительные советы, отличная информация! Спасибо! – asyncle

Смежные вопросы