В то время как это не может непосредственно устранить Вашу проблему, я нашел, что могу использовать <Ctrl> c
выходить из режима вставки. Это может также использоваться для выхода из экрана tmux, прокручивающего (который может быть вызван с помощью <leader> PgUP
)
Новый процесс будет создан в fork()
звоните, и запустится путем возврата из него точно так же, как родитель. Возвращаемое значение (в котором Вы сохранили retval
) от fork()
будет:
Ваш код тестирования работает правильно; это хранит возвращаемое значение от fork()
в child_pid
и использование if
проверять, ли это 0 или не (хотя это не проверяет на ошибку),
Я думал, что ветвление () создает тот же процесс, таким образом, я первоначально, что это в той программе, ветвление () вызов рекурсивно назвали бы навсегда. Я предполагаю, что новый процесс, созданный из ветвления (), запускается после ветвления () вызов?
Да. Давайте пронумеруем строки:
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.
Действительное решение этого
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
безотносительно кода сразу после fork()
, копируется в дочерний процесс, и не делайте путаницы родительский и дочерний процесс, они - два различных объекта, которые имеют то же (дублированный, не совместно использованный) среда.
Теперь посмотрите свой вывод...