运行 循环内的 fork 产生意外结果(测量进程切换时间)
Running fork inside a loop produces unexpected results (measuring process switch time)
我正在编写一个程序来测量执行进程切换所需的时间。为此,我让 parent 向其 child 写入一个字节的消息,然后 child 读取它。
我的问题出在这个循环中:
for(i=0; i<2; i++)
{
if(fork()==0) //child process, read
{
close(pipefd[1]);
read(pipefd[0]);
close(pipefd[0]);
}
else //parent process
{
close(pipefd[0]);
write(pipefd[1]);
close(pipefd[0]);
}
}
为了测试叉子击中 parent 和 child 的频率,我放入了一个 printf 语句,我在屏幕上打印了大约 15 个语句。考虑到循环应该只 运行 两次,这怎么可能?
这是因为每个子进程都会创建其他进程。
if
块执行后,每个子进程将在循环开始时 return 并再次 fork()
,直到所有子进程中 i == 2
。
编辑:
为了避免这种情况,我建议使用这样的东西:
if(fork() == 0)
{
//Do stuff
break;
}
也许这不是最优雅的方式,但应该可行。
我正在编写一个程序来测量执行进程切换所需的时间。为此,我让 parent 向其 child 写入一个字节的消息,然后 child 读取它。
我的问题出在这个循环中:
for(i=0; i<2; i++)
{
if(fork()==0) //child process, read
{
close(pipefd[1]);
read(pipefd[0]);
close(pipefd[0]);
}
else //parent process
{
close(pipefd[0]);
write(pipefd[1]);
close(pipefd[0]);
}
}
为了测试叉子击中 parent 和 child 的频率,我放入了一个 printf 语句,我在屏幕上打印了大约 15 个语句。考虑到循环应该只 运行 两次,这怎么可能?
这是因为每个子进程都会创建其他进程。
if
块执行后,每个子进程将在循环开始时 return 并再次 fork()
,直到所有子进程中 i == 2
。
编辑:
为了避免这种情况,我建议使用这样的东西:
if(fork() == 0)
{
//Do stuff
break;
}
也许这不是最优雅的方式,但应该可行。