我有这个实现来研究fork系统调用api和子进程的创建。
在这里,我从单亲创建5个子进程。我的问题是关于进程的调度。现在父进程和子进程将具有相同的优先级,因此调度器决定调度它们的唯一方法可能是通过there ppid。
在第一个fork之后,应该执行子进程,但显然父进程正在执行。这是正确的行为吗?(我是谁来质疑操作系统的行为)或者我之前关于调度的陈述是正确的……或者操作系统在这里玩一些把戏。
while(i++<5)
{
ret = fork();
if(ret<0)
{
perror("error in fork");
printf("the final value of i is %lu\n", i);
exit(1);
}
if(ret>0)
{
printf("I am in parent process context\n");
break ;
}
if(ret==0)
{
printf("I am in child process context\n");
printf("in child .. ppid is %lu ...and pid is %lu...and number is %d\n",getppid(),getpid(),i);
continue;
}
}
printf("in parent .. ppid is %lu ...and pid is %lu\n",getppid(),getpid());
输出:
我在父进程上下文中
在父..PPID是2084…PID是2149
我处于儿童过程上下文中
在孩子身上…PPID是2149…PID是2150…数字是1
我在父进程上下文中
在父..PPID是2149…PID是2150
我处于儿童过程上下文中
在孩子身上…PPID是2150…PID是2151…数字是2
我在父进程上下文中
在父..PPID是2150…PID是2151
我处于儿童过程上下文中
在孩子身上…PPID是2151…PID是2152…数字是3
我在父进程上下文中
在父..PPID是2151…PID是2152
我处于儿童过程上下文中
在孩子身上…PPID是2152…PID是2153…数字是4
我在父进程上下文中
在父..PPID是2152…PID是2153
我处于儿童过程上下文中
在孩子身上…PPID是2153…PID是2154…数字是5
在父..PPID是2153…PID是2154
最佳答案
好的,我找到了解决办法。有一个名为“sched_child_runs_first”的属性。
我们可以在以下路径中找到:
/proc/sys/kernel/sched_child_首先运行。
此值可以是0或1。这决定了调度顺序。