Если вы вызываете vfork, то почти во всех реализациях определяется, что сначала будет выполняться дочерний элемент, а затем будет выполняться родительский (до тех пор, пока дочерний вызов не вызывает exec). Так что вы заметите последовательное выполнение в случае vfork независимо от schedular.называется просто два новых процесса создаются. Они могут свободно работать независимо. (Как и любой другой процесс).Какой процесс будет запущен первым, будет сильно зависеть от алгоритма планирования.Помимо алгоритма планирования, число процессов, запущенных в это время, также будет определять характер вывода. Более того, если вы используете стандартные функции ввода-вывода библиотеки, они выводят данные в пакетах (вероятно, не то слово).Это также определит, в какой степени, кто будет писать первым.Вот пример кода (Это не имеет особого смысла практически, но все же хороший пример того, что родитель и потомок действительно работают синхронно
#include<stdio.h>
#include<string.h>
static void charAtTime(char buff[])
{
char *p=buff;
while(*p) {
putc(*p,stdout);
(p++);
}
}
int main()
{
setbuf(stdout,NULL); //set output stream to be unbuffered.Now each process will try to throw chars as soon as they are ready
int pid;
char buff[1000];
if((pid=fork())<0) //First fork
{
fprintf(stderr,"Fork error\n");
}
else if(pid==0)
{
strcpy(buff,"i am the child.I love beyblade.I love anime.I love pokemon\n");
charAtTime(buff);
}
else {
int pid2=fork(); //secnd fork
if(pid2==0){
strcpy(buff,"I am the younger child\n");
charAtTime(buff);
}
else {
int pid3;
pid3=fork(); //third fork
if(pid3==0)
{
strcpy(buff,"I am from the 2nd generation\n");
charAtTime(buff);
}
else {
strcpy(buff,"Our family tree is bit confusing\n");
charAtTime(buff);
}
}
strcpy(buff,"I am the big daddy of them.I have the right before them\n");
}
return 0;
}
Для моей системы выводится следующий вывод
i am thOeI u ra cmfha mtihley yoIturne geea rmi cshf irblodimt
thceo i2nnlfdd .uIg elnseoivrnea gb
teiyobnl
ade.I love anime.I love pokemon
Однако, если уменьшить число вилок до двух (конкурируют только два процесса), то вывод будет менее уродливым. Это родитель, который выполняется первым. (Возможно, потому что его текущий запущенный процесс создается другим процессом).)