2015-10-21 3 views
1

Я делаю некоторую программу на C с использованием fork()
Но я получаю неожиданный результат.Неожиданное поведение fork()

#include <stdio.h> 

main(){ 
    printf("\nStart of Program"); 
    fork(); 
    printf("\nEnd of Program"); 
} 

Выход:

Начало программы
Конец ProgramStart программы
Конец программы

Почему я получаю этот выход?

Вывод должен быть таким:

Начало программы
Конец программы
Конец программы

+0

Когда вы делаете fork, вы создаете точно такой же дочерний процесс, который имеет выход как его родительский. –

+0

Извините, я отредактировал вопрос – Swap

+5

Возможный дубликат [printf anomaly after "fork()"] (http://stackoverflow.com/questions/2530663/printf-anomaly-after-fork) –

ответ

2

Эта проблема происходит из-за буферизации.

Оценка: this Сообщение.

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

Должности также содержат пояснения по строкам.

+0

Пожалуйста, не копируйте и не связывайте ответы, пожалуйста, отметьте вопрос как дубликат. –

+0

@WernerHenze ya, это лучший способ на самом деле, я проголосовал за закрытие. – Haris

+0

Это странно. Я был первым, кто обманул голос. – sehe

-2

Я скомпилировал, что код сам, и я получаю следующий вывод:

Начало программы

Конец программы

Начало программы

Конец программы

Который является корр. ect с fork() порождает точно тот же самый дочерний процесс, из которого он разветвляется.

Редактировать: Благодаря комментариям я узнал, что происходит на самом деле. Вилка ведет себя так, как ожидалось, но буфер ввода не очищается до того, как выполняется дочерний процесс.Я изменил исходный код для этого:

#include <stdio.h> 

main(){ 
    printf("\nStart of Program\n"); 
    fflush(stdout); 
    fork(); 
    printf("\nEnd of Program\n"); 
} 

И выход теперь гласит:

запуск программы

Конец программы

Конец программы

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

+0

попробуйте с \ n в конце printf() как printf («Начало программы \ n»); Он даст еще один результат. – Swap

+0

@SwapnilDewakar такой же, за исключением того, что между линиями имеется еще один разрыв строки. – Magisch

+0

Используйте 'fflush (stdout);' после первого 'printf()', и вы увидите разницу.'fork()' продолжает ** после ** fork в дочернем и родительском процессах, поэтому похоже, что первый printf выполняется дважды, а это не так - результат является результатом буферизации. См. Ответ от @Haris. –

0

Это связано с printf(), printf выполняет буферизацию вывода и печатает только при достижении «\ n», поэтому при достижении printf("\nEnd of Program"); printf() печатает содержимое буфера, которое является «началом программы». Поскольку fork() дублирует ваш стек, буфер печати() также дублируется. Попытка:

#include<stdio.h> 
main(){ 
printf("Start of Program\n"); 
fork(); 
printf("End of Program\n"); 
} 
0

Немногие вещи здесь необходимо проверить.

Оттуда печатается «студент». Я не вижу, где вы печатаете ученика в своем коде.

Идеальный выход

Начало программы
Конец программы
Конец программы

Если вы не получаете выше выход я подозреваю, когда выполняется вилка и ребенок получил созданный, вероятно, ваш стандартный выходной вывод не был завершен. Сброс или \ n, поскольку последний символ в печати является обязательным для завершения задания на печать,

Чтобы проверить это, вы можете сделать это, прежде чем вилка просто использовать fflush. Также в printf используйте \ n как последний символ.

#include<stdio.h> 
main() 
{ 
    printf("Start of Program\n"); 
    fflush(NULL); 
    fork(); 
    printf("End of Program\n"); 
} 

Пробуйте это и сообщите нам.

0
when fork is come then new process is created. 

поэтому конец программы перед вызовом процесса вилки и после вызова fork. так что это логика.

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