Странное поведение execlp

0

Я не могу понять, почему exec в родительском процессе печатает после того, как дочерние функции.

Например, см. Этот код:

if(fork()) {
     // parent
     execlp("ls", "ls", "-l", 0);
     exit(0);
} else {
    // child
    printf("\nChild stuffs...\n");
}

Вывод:

Child stuffs
..................
... ls command ...

Почему "Детский материал" печатается перед исполнителем? У меня нет ожидания() или чего-то подобного, и я просто не могу понять это...

Все идеи приветствуются :)

  • 3
    Почему вы ожидаете, что это произойдет наоборот?
  • 0
    Почему нет? Если я изменю функцию execlp с помощью printf («Тест родительской печати»), она будет напечатана перед «Дочерними материалами»
Показать ещё 2 комментария
Теги:

1 ответ

1
Лучший ответ

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

Если вы переместите execlp в дочерний execlp, я бы предпочел, чтобы родитель с большей вероятностью отобразил вывод первым.

  • 0
    Я думал, что родительский процесс имеет больший приоритет, чем детский ... Есть ли официальный документ для получения дополнительной информации?
  • 1
    @NicoleGrefder Как правило, если вы не написали код, чтобы заставить его что-то делать по-другому, я считаю, что дочерний процесс наследует свой начальный приоритет от родительского. Там могут быть некоторые незначительные корректировки, но я не уверен. Однако объем работы, требуемый exec*() для настройки нового процесса, значителен, поэтому, особенно в современных многоядерных системах, у ребенка будет достаточно возможностей для запуска, прежде чем родитель будет готов запустить новый процесс. ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню