Как заставить форк взаимодействовать с меню родительского процесса, не печатая меню дважды? - PullRequest
0 голосов
/ 07 апреля 2019

Я делаю домашнее задание и мне нужна помощь, чтобы избежать печати дубликатов при использовании функции fork().

Предполагается, что поток моего кода выглядит следующим образом: меню печатается, пользователь выбираетнекоторые параметры, а затем он создает дубликат процесса, используя fork(), чтобы сделать то, что говорит опция.Я скрываю, что он делает со следующим кодом, и печатает вместо него, чтобы его было легче понять:

int main() {
    int option;
    pid_t pid;
    while (option != 3) {
       printf("\nMenu:"):
       printf("\n1 browser"):
       printf("\n2 terminal"):
       printf("\n3 finish"):
       printf("\nOption:"):
       scanf("%d", &option);
       switch (option) {
           case 1:
               if ((pid = fork()) == -1) {
                    printf("error");
               } else {
                    printf("browser");
               }
               break;
           case 2:
               if ((pid = fork()) == -1) {
                    printf("error");
               } else {
                    printf("terminal");
               }
               break;
           case 3:
               break;
           default:
               break;
    }
    return 0;
}

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

1 Ответ

2 голосов
/ 07 апреля 2019

Не ясно, что fork() делает что-то полезное для вас здесь, если только вы не пропустили какую-то существенную логику.

Если вы хотите использовать его, вам нужно:

  1. По-разному ведут себя в родительском и дочернем процессах, проверяя значение pid. (Это будет ноль в дочернем процессе.)

  2. Пусть этот дочерний процесс exit() будет выполнен, а не попадет в ваш основной цикл.

  3. Пусть родительский процесс использует wait() или waitpid(), чтобы дождаться завершения дочернего процесса, прежде чем продолжить основной цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...