После ветвления (), где ребенок начинает его выполнение?

В то время как это не может непосредственно устранить Вашу проблему, я нашел, что могу использовать <Ctrl> c выходить из режима вставки. Это может также использоваться для выхода из экрана tmux, прокручивающего (который может быть вызван с помощью <leader> PgUP)

22
07.03.2011, 00:25
4 ответа

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

  • 0 в дочернем процессе
  • PID ребенка в родительском процессе
  • - 1 в родителе, если был отказ (нет никакого ребенка, естественно),

Ваш код тестирования работает правильно; это хранит возвращаемое значение от fork() в child_pid и использование if проверять, ли это 0 или не (хотя это не проверяет на ошибку),

23
27.01.2020, 19:42

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

Да. Давайте пронумеруем строки:

int main (int argc, char **argv)
{
    int retval;                                               /* 1 */
    printf ("This is most definitely the parent process\n");  /* 2 */
    fflush (stdout);                                          /* 3 */
    retval = fork ();                                         /* 4 */
    printf ("Which process printed this?\n");                 /* 5 */
    return (EXIT_SUCCESS);                                    /* 6 */
}

Поток выполнения:

caller process     fork() → ...
                          ↘
original program            exec() → 2 → 3 → 4 → 5 → 6
                                               ↘
forked program                                   5 → 6

... который объясняет точно вывод, Вы получили.

Если Вы хотите знать, как исходная и разветвленная программа может возможно вести себя по-другому, так как они обязательно совместно используют тот же код, см. ответ Michael Mrozek.

13
27.01.2020, 19:42
  • 1
    Обратите внимание, что 1 не на самом деле инструкция. Также обратите внимание, что оригинал и разветвленные программы на самом деле не работают одновременно - любой должен будет ожидать другого для приведения / вытесненный. –  badp 28.11.2010, 14:32
  • 2
    В многоядерных системах / системах мульти-CPU, обе программы могут на самом деле работать одновременно. –  jlliagre 28.11.2010, 16:07
  • 3
    @jilliagre Многоядерные системы о многопоточности действительно. Что касается систем с несколькими центральными процессорами, я не знаю, если это так, или не на практике. Я не эксперт в этом поле - и это просто походит на такой маловероятный сценарий. Если бы мы соглашаемся, что ОС может выполнить несколько процессов одновременно (затем, как она обработала бы параллелизм?), к этому времени исходная инструкция по прогонам программы 4 на ЦП, другие центральные процессоры, вероятно, заняты, выполняя другие процессы так или иначе. –  badp 28.11.2010, 16:40
  • 4
    я сказал бы это, является вероятным сценарием, тем более, что существует базовый системный вызов с некоторым вводом-выводом, происходящим на шаге 5. Наличие всех занятых центральных процессоров является на самом деле не общей ситуацией, как ЦП редко является узким местом с текущими машинами. Это кажется также, что Вы путаете многопоточность и многоядерные. –  jlliagre 28.11.2010, 23:14
  • 5
    Могу я просто прокомментировать, чтобы сказать, что те диагональные стрелки являются фантастическими. последняя версия –  JBirch 29.11.2010, 12:30

Действительное решение этого

switch (fork()) {
    case -1 :
        fprintf (stderr, "fork failed (%s)\n", strerror(errno));
        break;
    case 0 :  // child process comes here
        break;
    default : // parent process
        break;
}

// all continue here
0
27.01.2020, 19:42

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

Теперь посмотрите свой вывод...

-1
27.01.2020, 19:42

Теги

Похожие вопросы