Ребенок выполняет весь процесс - PullRequest
0 голосов
/ 08 мая 2018

В этот код вводятся следующие команды: «СОЗДАТЬ», затем «ВЫЙТИ». Когда вызывается «CREATE», процессу необходимо выполнить разветвление и выполнить дополнительный код внутри дочернего процесса.

Мой вывод должен быть таким (с выводом на печать):

- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT

Тем не менее, у меня есть это:

- INPUT: CREATE
- CALLED_CREATE
- INPUT: QUIT
- INPUT: CREATE
- CALLED_CREATE
- CHILD_PROCESS
- INPUT: QUIT

Насколько я понимаю, fork() заключается в том, что родительский процесс продолжит выполнение кода, если он будет доступен для родителя, а также для ребенка - начиная с инструкции fork(). Вот мой код:

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

int main(){

    char user_input[100];

    int active_input = 0;

    int this_pid;

    while(active_input == 0){

        //receive user_input
        scanf("%s", user_input);
        printf("INPUT: %s\n", user_input);

        if(strcmp(user_input, "CREATE") == 0){

            printf("CALLED_CREATE\n");

            if((this_pid = fork()) < 0){
                perror("Failed to fork process");
                return EXIT_FAILURE;
            }

            //child
            if(this_pid == 0){

                printf("CHILD_PROCESS\n");
            }

            //parent
            if(this_pid > 0){

                //printf("PARENT_PROCESS\n");
            }
        }

        if(strcmp(user_input, "QUIT") == 0){
            active_input = 1;
            break;
        }
    }
}

Спасибо за вашу помощь :)

1 Ответ

0 голосов
/ 08 мая 2018

Я подозреваю, что главная проблема в том, что вы не останавливаете дочерний процесс. Например, после того, как вы введете один раз CREATE, дочерний процесс напечатает CHILD PROCESS, но продолжит цикл в своем собственном процессе, в то время как родитель делает то же самое.

Вы должны убедиться, что дочерний процесс завершается после выполнения чего-то значимого. Кроме того, как отмечалось выше Chrono Kitsune, родительский процесс должен wait(), чтобы дочерний процесс получил свой статус выхода и предотвратил зомби.

Кроме этого, ваш пользовательский буфер ввода составляет 100 символов, открывая вашу программу для буферизации атак переполнения. Но это другая история.

Ваш код, слегка переработанный, который, я думаю, делает то, что вы хотите:

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

int main() {
  char user_input[100];
  int this_pid;

  while (1) {
    //receive user_input
    scanf("%s", user_input);
    printf("INPUT: %s\n", user_input);

    if(strcmp(user_input, "CREATE") == 0){
      printf("CALLED_CREATE\n");

      if((this_pid = fork()) < 0){
        perror("Failed to fork process");
        return EXIT_FAILURE;
      }

      //child
      if (this_pid == 0){
        printf("CHILD_PROCESS\n");
        // do some interesting stuff here, and then don't forget to
        exit(0);
      }
    }

    if(strcmp(user_input, "QUIT") == 0)
      break;
  }
}
...