Я не могу понять, почему exec в родительском процессе печатает после того, как дочерние функции.
Например, см. Этот код:
if(fork()) {
// parent
execlp("ls", "ls", "-l", 0);
exit(0);
} else {
// child
printf("\nChild stuffs...\n");
}
Вывод:
Child stuffs
..................
... ls command ...
Почему "Детский материал" печатается перед исполнителем? У меня нет ожидания() или чего-то подобного, и я просто не могу понять это...
Все идеи приветствуются :)
Нет никакой гарантии, в каком порядке планировщик операционной системы будет запускать дочерний элемент и родительский процесс с равным приоритетом. В вашем случае можно заподозрить, что выход для ребенка печатается первым, потому что для выполнения внешней программы требуется некоторое время, тогда как printf
выполняется (и сбрасывается, если строка буферизирована) почти сразу.
Если вы переместите execlp
в дочерний execlp
, я бы предпочел, чтобы родитель с большей вероятностью отобразил вывод первым.
exec*()
для настройки нового процесса, значителен, поэтому, особенно в современных многоядерных системах, у ребенка будет достаточно возможностей для запуска, прежде чем родитель будет готов запустить новый процесс. ,